/*
 * @Author: 卡卡 1071780426@qq.com
 * @Date: 2022-08-16 14:28:02
 * @LastEditors: 卡卡 1071780426@qq.com
 * @LastEditTime: 2022-08-16 14:28:18
 * @FilePath: \qualitymeasurement\static\lib\ec.js
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
! function (e, t) {
  "object" == typeof exports && "object" == typeof module ? module.exports = t(require("echarts")) : "function" == typeof define && define.amd ? define(["echarts"], t) : "object" == typeof exports ? exports["echarts-gl"] = t(require("echarts")) : e["echarts-gl"] = t(e.echarts)
}(self, (function (e) {
      return (() => {
            "use strict";
            var t = {
                468: (e, t, r) => {
                    r.r(t);
                    var i = r(83);

                    function n(e, t, r) {
                      "object" == typeof t && (r = t, t = null);
                      var i, n = this;
                      if (!(e instanceof Function))
                        for (var s in i = [], e) e.hasOwnProperty(s) && i.push(s);
                      var l = function (t) {
                        if (n.apply(this, arguments), e instanceof Function ? a(this, e.call(this, t)) : o(this, e, i), this.constructor === l)
                          for (var r = l.__initializers__, s = 0; s < r.length; s++) r[s].apply(this, arguments)
                      };
                      l.__super__ = n, n.__initializers__ ? l.__initializers__ = n.__initializers__.slice() : l.__initializers__ = [], t && l.__initializers__.push(t);
                      var h = function () {};
                      return h.prototype = n.prototype, l.prototype = new h, l.prototype.constructor = l, a(l.prototype, r), l.extend = n.extend, l.derive = n.extend, l
                    }

                    function a(e, t) {
                      if (t)
                        for (var r in t) t.hasOwnProperty(r) && (e[r] = t[r])
                    }

                    function o(e, t, r) {
                      for (var i = 0; i < r.length; i++) {
                        var n = r[i];
                        e[n] = t[n]
                      }
                    }
                    const s = {
                      extend: n,
                      derive: n
                    };

                    function l(e, t) {
                      this.action = e, this.context = t
                    }
                    const h = {
                      trigger: function (e) {
                        if (this.hasOwnProperty("__handlers__") && this.__handlers__.hasOwnProperty(e)) {
                          var t = this.__handlers__[e],
                            r = t.length,
                            i = -1,
                            n = arguments;
                          switch (n.length) {
                            case 1:
                              for (; ++i < r;) t[i].action.call(t[i].context);
                              return;
                            case 2:
                              for (; ++i < r;) t[i].action.call(t[i].context, n[1]);
                              return;
                            case 3:
                              for (; ++i < r;) t[i].action.call(t[i].context, n[1], n[2]);
                              return;
                            case 4:
                              for (; ++i < r;) t[i].action.call(t[i].context, n[1], n[2], n[3]);
                              return;
                            case 5:
                              for (; ++i < r;) t[i].action.call(t[i].context, n[1], n[2], n[3], n[4]);
                              return;
                            default:
                              for (; ++i < r;) t[i].action.apply(t[i].context, Array.prototype.slice.call(n, 1));
                              return
                          }
                        }
                      },
                      on: function (e, t, r) {
                        if (e && t) {
                          var i = this.__handlers__ || (this.__handlers__ = {});
                          if (i[e]) {
                            if (this.has(e, t)) return
                          } else i[e] = [];
                          var n = new l(t, r || this);
                          return i[e].push(n), this
                        }
                      },
                      once: function (e, t, r) {
                        if (e && t) {
                          var i = this;
                          return this.on(e, (function r() {
                            i.off(e, r), t.apply(this, arguments)
                          }), r)
                        }
                      },
                      before: function (e, t, r) {
                        if (e && t) return e = "before" + e, this.on(e, t, r)
                      },
                      after: function (e, t, r) {
                        if (e && t) return e = "after" + e, this.on(e, t, r)
                      },
                      success: function (e, t) {
                        return this.once("success", e, t)
                      },
                      error: function (e, t) {
                        return this.once("error", e, t)
                      },
                      off: function (e, t) {
                        var r = this.__handlers__ || (this.__handlers__ = {});
                        if (t) {
                          if (r[e]) {
                            for (var i = r[e], n = [], a = 0; a < i.length; a++) t && i[a].action !== t && n.push(i[a]);
                            r[e] = n
                          }
                          return this
                        }
                        r[e] = []
                      },
                      has: function (e, t) {
                        var r = this.__handlers__;
                        if (!r || !r[e]) return !1;
                        for (var i = r[e], n = 0; n < i.length; n++)
                          if (i[n].action === t) return !0
                      }
                    };
                    var u = 0,
                      c = Array.prototype.forEach,
                      d = {
                        genGUID: function () {
                          return ++u
                        },
                        relative2absolute: function (e, t) {
                          if (!t || e.match(/^\//)) return e;
                          for (var r = e.split("/"), i = t.split("/"), n = r[0];
                            "." === n || ".." === n;) ".." === n && i.pop(), r.shift(), n = r[0];
                          return i.join("/") + "/" + r.join("/")
                        },
                        extend: function (e, t) {
                          if (t)
                            for (var r in t) t.hasOwnProperty(r) && (e[r] = t[r]);
                          return e
                        },
                        defaults: function (e, t) {
                          if (t)
                            for (var r in t) void 0 === e[r] && (e[r] = t[r]);
                          return e
                        },
                        extendWithPropList: function (e, t, r) {
                          if (t)
                            for (var i = 0; i < r.length; i++) {
                              var n = r[i];
                              e[n] = t[n]
                            }
                          return e
                        },
                        defaultsWithPropList: function (e, t, r) {
                          if (t)
                            for (var i = 0; i < r.length; i++) {
                              var n = r[i];
                              null == e[n] && (e[n] = t[n])
                            }
                          return e
                        },
                        each: function (e, t, r) {
                          if (e && t)
                            if (e.forEach && e.forEach === c) e.forEach(t, r);
                            else if (e.length === +e.length)
                            for (var i = 0, n = e.length; i < n; i++) t.call(r, e[i], i, e);
                          else
                            for (var a in e) e.hasOwnProperty(a) && t.call(r, e[a], a, e)
                        },
                        isObject: function (e) {
                          return e === Object(e)
                        },
                        isArray: function (e) {
                          return Array.isArray(e)
                        },
                        isArrayLike: function (e) {
                          return !!e && e.length === +e.length
                        },
                        clone: function (e) {
                          if (d.isObject(e)) {
                            if (d.isArray(e)) return e.slice();
                            if (d.isArrayLike(e)) {
                              for (var t = new e.constructor(e.length), r = 0; r < e.length; r++) t[r] = e[r];
                              return t
                            }
                            return d.extend({}, e)
                          }
                          return e
                        }
                      };
                    const f = d;
                    var p = function () {
                      this.__uid__ = f.genGUID()
                    };
                    p.__initializers__ = [function (e) {
                      f.extend(this, e)
                    }], f.extend(p, s), f.extend(p.prototype, h);
                    const m = p;
                    var g = ["OES_texture_float", "OES_texture_half_float", "OES_texture_float_linear", "OES_texture_half_float_linear", "OES_standard_derivatives", "OES_vertex_array_object", "OES_element_index_uint", "WEBGL_compressed_texture_s3tc", "WEBGL_depth_texture", "EXT_texture_filter_anisotropic", "EXT_shader_texture_lod", "WEBGL_draw_buffers", "EXT_frag_depth", "EXT_sRGB", "ANGLE_instanced_arrays"],
                      _ = ["MAX_TEXTURE_SIZE", "MAX_CUBE_MAP_TEXTURE_SIZE"];
                    const v = function (e) {
                        for (var t = {}, r = {}, i = 0; i < g.length; i++) a(g[i]);
                        for (i = 0; i < _.length; i++) {
                          var n = _[i];
                          r[n] = e.getParameter(e[n])
                        }

                        function a(r) {
                          if (e.getExtension) {
                            var i = e.getExtension(r);
                            i || (i = e.getExtension("MOZ_" + r)), i || (i = e.getExtension("WEBKIT_" + r)), t[r] = i
                          }
                        }
                        this.getExtension = function (e) {
                          return e in t || a(e), t[e]
                        }, this.getParameter = function (e) {
                          return r[e]
                        }
                      },
                      y = 1028,
                      x = 1029,
                      b = 2304,
                      w = 2305,
                      T = 5121,
                      S = 5126,
                      M = 6402,
                      A = 6408,
                      E = 9728,
                      C = 9729,
                      D = 9984,
                      L = 9985,
                      P = 9986,
                      O = 9987,
                      N = 10497,
                      I = 33071,
                      R = 33306,
                      B = {
                        get: function (e) {
                          var t = new XMLHttpRequest;
                          t.open("get", e.url), t.responseType = e.responseType || "text", e.onprogress && (t.onprogress = function (t) {
                            if (t.lengthComputable) {
                              var r = t.loaded / t.total;
                              e.onprogress(r, t.loaded, t.total)
                            } else e.onprogress(null)
                          }), t.onload = function (r) {
                            t.status >= 400 ? e.onerror && e.onerror() : e.onload && e.onload(t.response)
                          }, e.onerror && (t.onerror = e.onerror), t.send(null)
                        }
                      };
                    var F, z = {
                      supportWebGL: function () {
                        if (null == F) try {
                          var e = document.createElement("canvas");
                          if (!e.getContext("webgl") && !e.getContext("experimental-webgl")) throw new Error
                        } catch (e) {
                          F = !1
                        }
                        return F
                      }
                    };
                    z.Int8Array = "undefined" == typeof Int8Array ? Array : Int8Array, z.Uint8Array = "undefined" == typeof Uint8Array ? Array : Uint8Array, z.Uint16Array = "undefined" == typeof Uint16Array ? Array : Uint16Array, z.Uint32Array = "undefined" == typeof Uint32Array ? Array : Uint32Array, z.Int16Array = "undefined" == typeof Int16Array ? Array : Int16Array, z.Float32Array = "undefined" == typeof Float32Array ? Array : Float32Array, z.Float64Array = "undefined" == typeof Float64Array ? Array : Float64Array;
                    var G = {};
                    "undefined" != typeof window ? G = window : void 0 !== r.g && (G = r.g), z.requestAnimationFrame = G.requestAnimationFrame || G.msRequestAnimationFrame || G.mozRequestAnimationFrame || G.webkitRequestAnimationFrame || function (e) {
                      setTimeout(e, 16)
                    }, z.createCanvas = function () {
                      return document.createElement("canvas")
                    }, z.createImage = function () {
                      return new G.Image
                    }, z.request = {
                      get: B.get
                    }, z.addEventListener = function (e, t, r, i) {
                      e.addEventListener(t, r, i)
                    }, z.removeEventListener = function (e, t, r) {
                      e.removeEventListener(t, r)
                    };
                    const U = z;
                    var k = function () {
                      this.head = null, this.tail = null, this._length = 0
                    };
                    k.prototype.insert = function (e) {
                      var t = new k.Entry(e);
                      return this.insertEntry(t), t
                    }, k.prototype.insertAt = function (e, t) {
                      if (!(e < 0)) {
                        for (var r = this.head, i = 0; r && i != e;) r = r.next, i++;
                        if (r) {
                          var n = new k.Entry(t),
                            a = r.prev;
                          a ? (a.next = n, n.prev = a) : this.head = n, n.next = r, r.prev = n
                        } else this.insert(t)
                      }
                    }, k.prototype.insertBeforeEntry = function (e, t) {
                      var r = new k.Entry(e),
                        i = t.prev;
                      i ? (i.next = r, r.prev = i) : this.head = r, r.next = t, t.prev = r, this._length++
                    }, k.prototype.insertEntry = function (e) {
                      this.head ? (this.tail.next = e, e.prev = this.tail, this.tail = e) : this.head = this.tail = e, this._length++
                    }, k.prototype.remove = function (e) {
                      var t = e.prev,
                        r = e.next;
                      t ? t.next = r : this.head = r, r ? r.prev = t : this.tail = t, e.next = e.prev = null, this._length--
                    }, k.prototype.removeAt = function (e) {
                      if (!(e < 0)) {
                        for (var t = this.head, r = 0; t && r != e;) t = t.next, r++;
                        return t ? (this.remove(t), t.value) : void 0
                      }
                    }, k.prototype.getHead = function () {
                      if (this.head) return this.head.value
                    }, k.prototype.getTail = function () {
                      if (this.tail) return this.tail.value
                    }, k.prototype.getAt = function (e) {
                      if (!(e < 0)) {
                        for (var t = this.head, r = 0; t && r != e;) t = t.next, r++;
                        return t.value
                      }
                    }, k.prototype.indexOf = function (e) {
                      for (var t = this.head, r = 0; t;) {
                        if (t.value === e) return r;
                        t = t.next, r++
                      }
                    }, k.prototype.length = function () {
                      return this._length
                    }, k.prototype.isEmpty = function () {
                      return 0 === this._length
                    }, k.prototype.forEach = function (e, t) {
                      for (var r = this.head, i = 0, n = void 0 !== t; r;) n ? e.call(t, r.value, i) : e(r.value, i), r = r.next, i++
                    }, k.prototype.clear = function () {
                      this.tail = this.head = null, this._length = 0
                    }, k.Entry = function (e) {
                      this.value = e, this.next = null, this.prev = null
                    };
                    const V = k;
                    var H = function (e) {
                      this._list = new V, this._map = {}, this._maxSize = e || 10
                    };
                    H.prototype.setMaxSize = function (e) {
                      this._maxSize = e
                    }, H.prototype.put = function (e, t) {
                      if (!this._map.hasOwnProperty(e)) {
                        var r = this._list.length();
                        if (r >= this._maxSize && r > 0) {
                          var i = this._list.head;
                          this._list.remove(i), delete this._map[i.key]
                        }
                        var n = this._list.insert(t);
                        n.key = e, this._map[e] = n
                      }
                    }, H.prototype.get = function (e) {
                      var t = this._map[e];
                      if (this._map.hasOwnProperty(e)) return t !== this._list.tail && (this._list.remove(t), this._list.insertEntry(t)), t.value
                    }, H.prototype.remove = function (e) {
                      var t = this._map[e];
                      void 0 !== t && (delete this._map[e], this._list.remove(t))
                    }, H.prototype.clear = function () {
                      this._list.clear(), this._map = {}
                    };
                    const W = H;
                    var j = {},
                      X = {
                        transparent: [0, 0, 0, 0],
                        aliceblue: [240, 248, 255, 1],
                        antiquewhite: [250, 235, 215, 1],
                        aqua: [0, 255, 255, 1],
                        aquamarine: [127, 255, 212, 1],
                        azure: [240, 255, 255, 1],
                        beige: [245, 245, 220, 1],
                        bisque: [255, 228, 196, 1],
                        black: [0, 0, 0, 1],
                        blanchedalmond: [255, 235, 205, 1],
                        blue: [0, 0, 255, 1],
                        blueviolet: [138, 43, 226, 1],
                        brown: [165, 42, 42, 1],
                        burlywood: [222, 184, 135, 1],
                        cadetblue: [95, 158, 160, 1],
                        chartreuse: [127, 255, 0, 1],
                        chocolate: [210, 105, 30, 1],
                        coral: [255, 127, 80, 1],
                        cornflowerblue: [100, 149, 237, 1],
                        cornsilk: [255, 248, 220, 1],
                        crimson: [220, 20, 60, 1],
                        cyan: [0, 255, 255, 1],
                        darkblue: [0, 0, 139, 1],
                        darkcyan: [0, 139, 139, 1],
                        darkgoldenrod: [184, 134, 11, 1],
                        darkgray: [169, 169, 169, 1],
                        darkgreen: [0, 100, 0, 1],
                        darkgrey: [169, 169, 169, 1],
                        darkkhaki: [189, 183, 107, 1],
                        darkmagenta: [139, 0, 139, 1],
                        darkolivegreen: [85, 107, 47, 1],
                        darkorange: [255, 140, 0, 1],
                        darkorchid: [153, 50, 204, 1],
                        darkred: [139, 0, 0, 1],
                        darksalmon: [233, 150, 122, 1],
                        darkseagreen: [143, 188, 143, 1],
                        darkslateblue: [72, 61, 139, 1],
                        darkslategray: [47, 79, 79, 1],
                        darkslategrey: [47, 79, 79, 1],
                        darkturquoise: [0, 206, 209, 1],
                        darkviolet: [148, 0, 211, 1],
                        deeppink: [255, 20, 147, 1],
                        deepskyblue: [0, 191, 255, 1],
                        dimgray: [105, 105, 105, 1],
                        dimgrey: [105, 105, 105, 1],
                        dodgerblue: [30, 144, 255, 1],
                        firebrick: [178, 34, 34, 1],
                        floralwhite: [255, 250, 240, 1],
                        forestgreen: [34, 139, 34, 1],
                        fuchsia: [255, 0, 255, 1],
                        gainsboro: [220, 220, 220, 1],
                        ghostwhite: [248, 248, 255, 1],
                        gold: [255, 215, 0, 1],
                        goldenrod: [218, 165, 32, 1],
                        gray: [128, 128, 128, 1],
                        green: [0, 128, 0, 1],
                        greenyellow: [173, 255, 47, 1],
                        grey: [128, 128, 128, 1],
                        honeydew: [240, 255, 240, 1],
                        hotpink: [255, 105, 180, 1],
                        indianred: [205, 92, 92, 1],
                        indigo: [75, 0, 130, 1],
                        ivory: [255, 255, 240, 1],
                        khaki: [240, 230, 140, 1],
                        lavender: [230, 230, 250, 1],
                        lavenderblush: [255, 240, 245, 1],
                        lawngreen: [124, 252, 0, 1],
                        lemonchiffon: [255, 250, 205, 1],
                        lightblue: [173, 216, 230, 1],
                        lightcoral: [240, 128, 128, 1],
                        lightcyan: [224, 255, 255, 1],
                        lightgoldenrodyellow: [250, 250, 210, 1],
                        lightgray: [211, 211, 211, 1],
                        lightgreen: [144, 238, 144, 1],
                        lightgrey: [211, 211, 211, 1],
                        lightpink: [255, 182, 193, 1],
                        lightsalmon: [255, 160, 122, 1],
                        lightseagreen: [32, 178, 170, 1],
                        lightskyblue: [135, 206, 250, 1],
                        lightslategray: [119, 136, 153, 1],
                        lightslategrey: [119, 136, 153, 1],
                        lightsteelblue: [176, 196, 222, 1],
                        lightyellow: [255, 255, 224, 1],
                        lime: [0, 255, 0, 1],
                        limegreen: [50, 205, 50, 1],
                        linen: [250, 240, 230, 1],
                        magenta: [255, 0, 255, 1],
                        maroon: [128, 0, 0, 1],
                        mediumaquamarine: [102, 205, 170, 1],
                        mediumblue: [0, 0, 205, 1],
                        mediumorchid: [186, 85, 211, 1],
                        mediumpurple: [147, 112, 219, 1],
                        mediumseagreen: [60, 179, 113, 1],
                        mediumslateblue: [123, 104, 238, 1],
                        mediumspringgreen: [0, 250, 154, 1],
                        mediumturquoise: [72, 209, 204, 1],
                        mediumvioletred: [199, 21, 133, 1],
                        midnightblue: [25, 25, 112, 1],
                        mintcream: [245, 255, 250, 1],
                        mistyrose: [255, 228, 225, 1],
                        moccasin: [255, 228, 181, 1],
                        navajowhite: [255, 222, 173, 1],
                        navy: [0, 0, 128, 1],
                        oldlace: [253, 245, 230, 1],
                        olive: [128, 128, 0, 1],
                        olivedrab: [107, 142, 35, 1],
                        orange: [255, 165, 0, 1],
                        orangered: [255, 69, 0, 1],
                        orchid: [218, 112, 214, 1],
                        palegoldenrod: [238, 232, 170, 1],
                        palegreen: [152, 251, 152, 1],
                        paleturquoise: [175, 238, 238, 1],
                        palevioletred: [219, 112, 147, 1],
                        papayawhip: [255, 239, 213, 1],
                        peachpuff: [255, 218, 185, 1],
                        peru: [205, 133, 63, 1],
                        pink: [255, 192, 203, 1],
                        plum: [221, 160, 221, 1],
                        powderblue: [176, 224, 230, 1],
                        purple: [128, 0, 128, 1],
                        red: [255, 0, 0, 1],
                        rosybrown: [188, 143, 143, 1],
                        royalblue: [65, 105, 225, 1],
                        saddlebrown: [139, 69, 19, 1],
                        salmon: [250, 128, 114, 1],
                        sandybrown: [244, 164, 96, 1],
                        seagreen: [46, 139, 87, 1],
                        seashell: [255, 245, 238, 1],
                        sienna: [160, 82, 45, 1],
                        silver: [192, 192, 192, 1],
                        skyblue: [135, 206, 235, 1],
                        slateblue: [106, 90, 205, 1],
                        slategray: [112, 128, 144, 1],
                        slategrey: [112, 128, 144, 1],
                        snow: [255, 250, 250, 1],
                        springgreen: [0, 255, 127, 1],
                        steelblue: [70, 130, 180, 1],
                        tan: [210, 180, 140, 1],
                        teal: [0, 128, 128, 1],
                        thistle: [216, 191, 216, 1],
                        tomato: [255, 99, 71, 1],
                        turquoise: [64, 224, 208, 1],
                        violet: [238, 130, 238, 1],
                        wheat: [245, 222, 179, 1],
                        white: [255, 255, 255, 1],
                        whitesmoke: [245, 245, 245, 1],
                        yellow: [255, 255, 0, 1],
                        yellowgreen: [154, 205, 50, 1]
                      };

                    function q(e) {
                      return (e = Math.round(e)) < 0 ? 0 : e > 255 ? 255 : e
                    }

                    function Z(e) {
                      return e < 0 ? 0 : e > 1 ? 1 : e
                    }

                    function Y(e) {
                      return e.length && "%" === e.charAt(e.length - 1) ? q(parseFloat(e) / 100 * 255) : q(parseInt(e, 10))
                    }

                    function K(e) {
                      return e.length && "%" === e.charAt(e.length - 1) ? Z(parseFloat(e) / 100) : Z(parseFloat(e))
                    }

                    function Q(e, t, r) {
                      return r < 0 ? r += 1 : r > 1 && (r -= 1), 6 * r < 1 ? e + (t - e) * r * 6 : 2 * r < 1 ? t : 3 * r < 2 ? e + (t - e) * (2 / 3 - r) * 6 : e
                    }

                    function J(e, t, r) {
                      return e + (t - e) * r
                    }

                    function $(e, t, r, i, n) {
                      return e[0] = t, e[1] = r, e[2] = i, e[3] = n, e
                    }

                    function ee(e, t) {
                      return e[0] = t[0], e[1] = t[1], e[2] = t[2], e[3] = t[3], e
                    }
                    var te = new W(20),
                      re = null;

                    function ie(e, t) {
                      re && ee(re, t), re = te.put(e, re || t.slice())
                    }

                    function ne(e, t) {
                      var r = (parseFloat(e[0]) % 360 + 360) % 360 / 360,
                        i = K(e[1]),
                        n = K(e[2]),
                        a = n <= .5 ? n * (i + 1) : n + i - n * i,
                        o = 2 * n - a;
                      return $(t = t || [], q(255 * Q(o, a, r + 1 / 3)), q(255 * Q(o, a, r)), q(255 * Q(o, a, r - 1 / 3)), 1), 4 === e.length && (t[3] = e[3]), t
                    }
                    j.parse = function (e, t) {
                      if (e) {
                        t = t || [];
                        var r = te.get(e);
                        if (r) return ee(t, r);
                        var i, n = (e += "").replace(/ /g, "").toLowerCase();
                        if (n in X) return ee(t, X[n]), ie(e, t), t;
                        if ("#" === n.charAt(0)) return 4 === n.length ? (i = parseInt(n.substr(1), 16)) >= 0 && i <= 4095 ? ($(t, (3840 & i) >> 4 | (3840 & i) >> 8, 240 & i | (240 & i) >> 4, 15 & i | (15 & i) << 4, 1), ie(e, t), t) : void $(t, 0, 0, 0, 1) : 7 === n.length ? (i = parseInt(n.substr(1), 16)) >= 0 && i <= 16777215 ? ($(t, (16711680 & i) >> 16, (65280 & i) >> 8, 255 & i, 1), ie(e, t), t) : void $(t, 0, 0, 0, 1) : void 0;
                        var a = n.indexOf("("),
                          o = n.indexOf(")");
                        if (-1 !== a && o + 1 === n.length) {
                          var s = n.substr(0, a),
                            l = n.substr(a + 1, o - (a + 1)).split(","),
                            h = 1;
                          switch (s) {
                            case "rgba":
                              if (4 !== l.length) return void $(t, 0, 0, 0, 1);
                              h = K(l.pop());
                            case "rgb":
                              return 3 !== l.length ? void $(t, 0, 0, 0, 1) : ($(t, Y(l[0]), Y(l[1]), Y(l[2]), h), ie(e, t), t);
                            case "hsla":
                              return 4 !== l.length ? void $(t, 0, 0, 0, 1) : (l[3] = K(l[3]), ne(l, t), ie(e, t), t);
                            case "hsl":
                              return 3 !== l.length ? void $(t, 0, 0, 0, 1) : (ne(l, t), ie(e, t), t);
                            default:
                              return
                          }
                        }
                        $(t, 0, 0, 0, 1)
                      }
                    }, j.parseToFloat = function (e, t) {
                      if (t = j.parse(e, t)) return t[0] /= 255, t[1] /= 255, t[2] /= 255, t
                    }, j.lift = function (e, t) {
                      var r = j.parse(e);
                      if (r) {
                        for (var i = 0; i < 3; i++) r[i] = t < 0 ? r[i] * (1 - t) | 0 : (255 - r[i]) * t + r[i] | 0;
                        return j.stringify(r, 4 === r.length ? "rgba" : "rgb")
                      }
                    }, j.toHex = function (e) {
                      var t = j.parse(e);
                      if (t) return ((1 << 24) + (t[0] << 16) + (t[1] << 8) + +t[2]).toString(16).slice(1)
                    }, j.fastLerp = function (e, t, r) {
                      if (t && t.length && e >= 0 && e <= 1) {
                        r = r || [];
                        var i = e * (t.length - 1),
                          n = Math.floor(i),
                          a = Math.ceil(i),
                          o = t[n],
                          s = t[a],
                          l = i - n;
                        return r[0] = q(J(o[0], s[0], l)), r[1] = q(J(o[1], s[1], l)), r[2] = q(J(o[2], s[2], l)), r[3] = Z(J(o[3], s[3], l)), r
                      }
                    }, j.fastMapToColor = j.fastLerp, j.lerp = function (e, t, r) {
                      if (t && t.length && e >= 0 && e <= 1) {
                        var i = e * (t.length - 1),
                          n = Math.floor(i),
                          a = Math.ceil(i),
                          o = j.parse(t[n]),
                          s = j.parse(t[a]),
                          l = i - n,
                          h = j.stringify([q(J(o[0], s[0], l)), q(J(o[1], s[1], l)), q(J(o[2], s[2], l)), Z(J(o[3], s[3], l))], "rgba");
                        return r ? {
                          color: h,
                          leftIndex: n,
                          rightIndex: a,
                          value: i
                        } : h
                      }
                    }, j.mapToColor = j.lerp, j.modifyHSL = function (e, t, r, i) {
                      if (e = j.parse(e)) return e = function (e) {
                        if (e) {
                          var t, r, i = e[0] / 255,
                            n = e[1] / 255,
                            a = e[2] / 255,
                            o = Math.min(i, n, a),
                            s = Math.max(i, n, a),
                            l = s - o,
                            h = (s + o) / 2;
                          if (0 === l) t = 0, r = 0;
                          else {
                            r = h < .5 ? l / (s + o) : l / (2 - s - o);
                            var u = ((s - i) / 6 + l / 2) / l,
                              c = ((s - n) / 6 + l / 2) / l,
                              d = ((s - a) / 6 + l / 2) / l;
                            i === s ? t = d - c : n === s ? t = 1 / 3 + u - d : a === s && (t = 2 / 3 + c - u), t < 0 && (t += 1), t > 1 && (t -= 1)
                          }
                          var f = [360 * t, r, h];
                          return null != e[3] && f.push(e[3]), f
                        }
                      }(e), null != t && (e[0] = (n = t, (n = Math.round(n)) < 0 ? 0 : n > 360 ? 360 : n)), null != r && (e[1] = K(r)), null != i && (e[2] = K(i)), j.stringify(ne(e), "rgba");
                      var n
                    }, j.modifyAlpha = function (e, t) {
                      if ((e = j.parse(e)) && null != t) return e[3] = Z(t), j.stringify(e, "rgba")
                    }, j.stringify = function (e, t) {
                      if (e && e.length) {
                        var r = e[0] + "," + e[1] + "," + e[2];
                        return "rgba" !== t && "hsva" !== t && "hsla" !== t || (r += "," + e[3]), t + "(" + r + ")"
                      }
                    };
                    var ae = j.parseToFloat,
                      oe = {};

                    function se(e) {
                      var t = Object.keys(e);
                      t.sort();
                      for (var r = [], i = 0; i < t.length; i++) {
                        var n = t[i],
                          a = e[n];
                        null === a ? r.push(n) : r.push(n + " " + a.toString())
                      }
                      return r.join("\n")
                    }
                    const le = m.extend((function () {
                      return {
                        name: "",
                        depthTest: !0,
                        depthMask: !0,
                        transparent: !1,
                        blend: null,
                        autoUpdateTextureStatus: !0,
                        uniforms: {},
                        vertexDefines: {},
                        fragmentDefines: {},
                        _textureStatus: {},
                        _enabledUniforms: null
                      }
                    }), (function () {
                      this.name || (this.name = "MATERIAL_" + this.__uid__), this.shader && this.attachShader(this.shader, !0)
                    }), {
                      precision: "highp",
                      setUniform: function (e, t) {
                        void 0 === t && console.warn('Uniform value "' + e + '" is undefined');
                        var r = this.uniforms[e];
                        r && ("string" == typeof t && (t = ae(t) || t), r.value = t, this.autoUpdateTextureStatus && "t" === r.type && (t ? this.enableTexture(e) : this.disableTexture(e)))
                      },
                      setUniforms: function (e) {
                        for (var t in e) {
                          var r = e[t];
                          this.setUniform(t, r)
                        }
                      },
                      isUniformEnabled: function (e) {
                        return this._enabledUniforms.indexOf(e) >= 0
                      },
                      getEnabledUniforms: function () {
                        return this._enabledUniforms
                      },
                      getTextureUniforms: function () {
                        return this._textureUniforms
                      },
                      set: function (e, t) {
                        if ("object" == typeof e)
                          for (var r in e) {
                            var i = e[r];
                            this.setUniform(r, i)
                          } else this.setUniform(e, t)
                      },
                      get: function (e) {
                        var t = this.uniforms[e];
                        if (t) return t.value
                      },
                      attachShader: function (e, t) {
                        var r = this.uniforms;
                        this.uniforms = e.createUniforms(), this.shader = e;
                        var i = this.uniforms;
                        this._enabledUniforms = Object.keys(i), this._enabledUniforms.sort(), this._textureUniforms = this._enabledUniforms.filter((function (e) {
                          var t = this.uniforms[e].type;
                          return "t" === t || "tv" === t
                        }), this);
                        var n = this.vertexDefines,
                          a = this.fragmentDefines;
                        if (this.vertexDefines = f.clone(e.vertexDefines), this.fragmentDefines = f.clone(e.fragmentDefines), t) {
                          for (var o in r) i[o] && (i[o].value = r[o].value);
                          f.defaults(this.vertexDefines, n), f.defaults(this.fragmentDefines, a)
                        }
                        var s = {};
                        for (var l in e.textures) s[l] = {
                          shaderType: e.textures[l].shaderType,
                          type: e.textures[l].type,
                          enabled: !(!t || !this._textureStatus[l]) && this._textureStatus[l].enabled
                        };
                        this._textureStatus = s, this._programKey = ""
                      },
                      clone: function () {
                        var e = new this.constructor({
                          name: this.name,
                          shader: this.shader
                        });
                        for (var t in this.uniforms) e.uniforms[t].value = this.uniforms[t].value;
                        return e.depthTest = this.depthTest, e.depthMask = this.depthMask, e.transparent = this.transparent, e.blend = this.blend, e.vertexDefines = f.clone(this.vertexDefines), e.fragmentDefines = f.clone(this.fragmentDefines), e.enableTexture(this.getEnabledTextures()), e.precision = this.precision, e
                      },
                      define: function (e, t, r) {
                        var i = this.vertexDefines,
                          n = this.fragmentDefines;
                        "vertex" !== e && "fragment" !== e && "both" !== e && arguments.length < 3 && (r = t, t = e, e = "both"), r = null != r ? r : null, "vertex" !== e && "both" !== e || i[t] !== r && (i[t] = r, this._programKey = ""), "fragment" !== e && "both" !== e || n[t] !== r && (n[t] = r, "both" !== e && (this._programKey = ""))
                      },
                      undefine: function (e, t) {
                        "vertex" !== e && "fragment" !== e && "both" !== e && arguments.length < 2 && (t = e, e = "both"), "vertex" !== e && "both" !== e || this.isDefined("vertex", t) && (delete this.vertexDefines[t], this._programKey = ""), "fragment" !== e && "both" !== e || this.isDefined("fragment", t) && (delete this.fragmentDefines[t], "both" !== e && (this._programKey = ""))
                      },
                      isDefined: function (e, t) {
                        switch (e) {
                          case "vertex":
                            return void 0 !== this.vertexDefines[t];
                          case "fragment":
                            return void 0 !== this.fragmentDefines[t]
                        }
                      },
                      getDefine: function (e, t) {
                        switch (e) {
                          case "vertex":
                            return this.vertexDefines[t];
                          case "fragment":
                            return this.fragmentDefines[t]
                        }
                      },
                      enableTexture: function (e) {
                        if (Array.isArray(e))
                          for (var t = 0; t < e.length; t++) this.enableTexture(e[t]);
                        else {
                          var r = this._textureStatus[e];
                          r && (r.enabled || (r.enabled = !0, this._programKey = ""))
                        }
                      },
                      enableTexturesAll: function () {
                        var e = this._textureStatus;
                        for (var t in e) e[t].enabled = !0;
                        this._programKey = ""
                      },
                      disableTexture: function (e) {
                        if (Array.isArray(e))
                          for (var t = 0; t < e.length; t++) this.disableTexture(e[t]);
                        else {
                          var r = this._textureStatus[e];
                          r && (!r.enabled || (r.enabled = !1, this._programKey = ""))
                        }
                      },
                      disableTexturesAll: function () {
                        var e = this._textureStatus;
                        for (var t in e) e[t].enabled = !1;
                        this._programKey = ""
                      },
                      isTextureEnabled: function (e) {
                        var t = this._textureStatus;
                        return !!t[e] && t[e].enabled
                      },
                      getEnabledTextures: function () {
                        var e = [],
                          t = this._textureStatus;
                        for (var r in t) t[r].enabled && e.push(r);
                        return e
                      },
                      dirtyDefines: function () {
                        this._programKey = ""
                      },
                      getProgramKey: function () {
                        return this._programKey || (this._programKey = function (e, t, r) {
                          r.sort();
                          for (var i = [], n = 0; n < r.length; n++) {
                            var a = r[n];
                            i.push(a)
                          }
                          var o = se(e) + "\n" + se(t) + "\n" + i.join("\n");
                          if (oe[o]) return oe[o];
                          var s = f.genGUID();
                          return oe[o] = s, s
                        }(this.vertexDefines, this.fragmentDefines, this.getEnabledTextures())), this._programKey
                      }
                    });
                    var he, ue = 1e-6,
                      ce = Array,
                      de = Math.random,
                      fe = {
                        create: function () {
                          var e = new ce(2);
                          return e[0] = 0, e[1] = 0, e
                        },
                        clone: function (e) {
                          var t = new ce(2);
                          return t[0] = e[0], t[1] = e[1], t
                        },
                        fromValues: function (e, t) {
                          var r = new ce(2);
                          return r[0] = e, r[1] = t, r
                        },
                        copy: function (e, t) {
                          return e[0] = t[0], e[1] = t[1], e
                        },
                        set: function (e, t, r) {
                          return e[0] = t, e[1] = r, e
                        },
                        add: function (e, t, r) {
                          return e[0] = t[0] + r[0], e[1] = t[1] + r[1], e
                        },
                        subtract: function (e, t, r) {
                          return e[0] = t[0] - r[0], e[1] = t[1] - r[1], e
                        }
                      };
                    fe.sub = fe.subtract, fe.multiply = function (e, t, r) {
                      return e[0] = t[0] * r[0], e[1] = t[1] * r[1], e
                    }, fe.mul = fe.multiply, fe.divide = function (e, t, r) {
                      return e[0] = t[0] / r[0], e[1] = t[1] / r[1], e
                    }, fe.div = fe.divide, fe.min = function (e, t, r) {
                      return e[0] = Math.min(t[0], r[0]), e[1] = Math.min(t[1], r[1]), e
                    }, fe.max = function (e, t, r) {
                      return e[0] = Math.max(t[0], r[0]), e[1] = Math.max(t[1], r[1]), e
                    }, fe.scale = function (e, t, r) {
                      return e[0] = t[0] * r, e[1] = t[1] * r, e
                    }, fe.scaleAndAdd = function (e, t, r, i) {
                      return e[0] = t[0] + r[0] * i, e[1] = t[1] + r[1] * i, e
                    }, fe.distance = function (e, t) {
                      var r = t[0] - e[0],
                        i = t[1] - e[1];
                      return Math.sqrt(r * r + i * i)
                    }, fe.dist = fe.distance, fe.squaredDistance = function (e, t) {
                      var r = t[0] - e[0],
                        i = t[1] - e[1];
                      return r * r + i * i
                    }, fe.sqrDist = fe.squaredDistance, fe.length = function (e) {
                      var t = e[0],
                        r = e[1];
                      return Math.sqrt(t * t + r * r)
                    }, fe.len = fe.length, fe.squaredLength = function (e) {
                      var t = e[0],
                        r = e[1];
                      return t * t + r * r
                    }, fe.sqrLen = fe.squaredLength, fe.negate = function (e, t) {
                      return e[0] = -t[0], e[1] = -t[1], e
                    }, fe.inverse = function (e, t) {
                      return e[0] = 1 / t[0], e[1] = 1 / t[1], e
                    }, fe.normalize = function (e, t) {
                      var r = t[0],
                        i = t[1],
                        n = r * r + i * i;
                      return n > 0 && (n = 1 / Math.sqrt(n), e[0] = t[0] * n, e[1] = t[1] * n), e
                    }, fe.dot = function (e, t) {
                      return e[0] * t[0] + e[1] * t[1]
                    }, fe.cross = function (e, t, r) {
                      var i = t[0] * r[1] - t[1] * r[0];
                      return e[0] = e[1] = 0, e[2] = i, e
                    }, fe.lerp = function (e, t, r, i) {
                      var n = t[0],
                        a = t[1];
                      return e[0] = n + i * (r[0] - n), e[1] = a + i * (r[1] - a), e
                    }, fe.random = function (e, t) {
                      t = t || 1;
                      var r = 2 * GLMAT_RANDOM() * Math.PI;
                      return e[0] = Math.cos(r) * t, e[1] = Math.sin(r) * t, e
                    }, fe.transformMat2 = function (e, t, r) {
                      var i = t[0],
                        n = t[1];
                      return e[0] = r[0] * i + r[2] * n, e[1] = r[1] * i + r[3] * n, e
                    }, fe.transformMat2d = function (e, t, r) {
                      var i = t[0],
                        n = t[1];
                      return e[0] = r[0] * i + r[2] * n + r[4], e[1] = r[1] * i + r[3] * n + r[5], e
                    }, fe.transformMat3 = function (e, t, r) {
                      var i = t[0],
                        n = t[1];
                      return e[0] = r[0] * i + r[3] * n + r[6], e[1] = r[1] * i + r[4] * n + r[7], e
                    }, fe.transformMat4 = function (e, t, r) {
                      var i = t[0],
                        n = t[1];
                      return e[0] = r[0] * i + r[4] * n + r[12], e[1] = r[1] * i + r[5] * n + r[13], e
                    }, fe.forEach = (he = fe.create(), function (e, t, r, i, n, a) {
                      var o, s;
                      for (t || (t = 2), r || (r = 0), s = i ? Math.min(i * t + r, e.length) : e.length, o = r; o < s; o += t) he[0] = e[o], he[1] = e[o + 1], n(he, he, a), e[o] = he[0], e[o + 1] = he[1];
                      return e
                    });
                    const pe = fe;
                    var me = function (e, t) {
                      e = e || 0, t = t || 0, this.array = pe.fromValues(e, t), this._dirty = !0
                    };
                    if (me.prototype = {
                        constructor: me,
                        add: function (e) {
                          return pe.add(this.array, this.array, e.array), this._dirty = !0, this
                        },
                        set: function (e, t) {
                          return this.array[0] = e, this.array[1] = t, this._dirty = !0, this
                        },
                        setArray: function (e) {
                          return this.array[0] = e[0], this.array[1] = e[1], this._dirty = !0, this
                        },
                        clone: function () {
                          return new me(this.x, this.y)
                        },
                        copy: function (e) {
                          return pe.copy(this.array, e.array), this._dirty = !0, this
                        },
                        cross: function (e, t) {
                          return pe.cross(e.array, this.array, t.array), e._dirty = !0, this
                        },
                        dist: function (e) {
                          return pe.dist(this.array, e.array)
                        },
                        distance: function (e) {
                          return pe.distance(this.array, e.array)
                        },
                        div: function (e) {
                          return pe.div(this.array, this.array, e.array), this._dirty = !0, this
                        },
                        divide: function (e) {
                          return pe.divide(this.array, this.array, e.array), this._dirty = !0, this
                        },
                        dot: function (e) {
                          return pe.dot(this.array, e.array)
                        },
                        len: function () {
                          return pe.len(this.array)
                        },
                        length: function () {
                          return pe.length(this.array)
                        },
                        lerp: function (e, t, r) {
                          return pe.lerp(this.array, e.array, t.array, r), this._dirty = !0, this
                        },
                        min: function (e) {
                          return pe.min(this.array, this.array, e.array), this._dirty = !0, this
                        },
                        max: function (e) {
                          return pe.max(this.array, this.array, e.array), this._dirty = !0, this
                        },
                        mul: function (e) {
                          return pe.mul(this.array, this.array, e.array), this._dirty = !0, this
                        },
                        multiply: function (e) {
                          return pe.multiply(this.array, this.array, e.array), this._dirty = !0, this
                        },
                        negate: function () {
                          return pe.negate(this.array, this.array), this._dirty = !0, this
                        },
                        normalize: function () {
                          return pe.normalize(this.array, this.array), this._dirty = !0, this
                        },
                        random: function (e) {
                          return pe.random(this.array, e), this._dirty = !0, this
                        },
                        scale: function (e) {
                          return pe.scale(this.array, this.array, e), this._dirty = !0, this
                        },
                        scaleAndAdd: function (e, t) {
                          return pe.scaleAndAdd(this.array, this.array, e.array, t), this._dirty = !0, this
                        },
                        sqrDist: function (e) {
                          return pe.sqrDist(this.array, e.array)
                        },
                        squaredDistance: function (e) {
                          return pe.squaredDistance(this.array, e.array)
                        },
                        sqrLen: function () {
                          return pe.sqrLen(this.array)
                        },
                        squaredLength: function () {
                          return pe.squaredLength(this.array)
                        },
                        sub: function (e) {
                          return pe.sub(this.array, this.array, e.array), this._dirty = !0, this
                        },
                        subtract: function (e) {
                          return pe.subtract(this.array, this.array, e.array), this._dirty = !0, this
                        },
                        transformMat2: function (e) {
                          return pe.transformMat2(this.array, this.array, e.array), this._dirty = !0, this
                        },
                        transformMat2d: function (e) {
                          return pe.transformMat2d(this.array, this.array, e.array), this._dirty = !0, this
                        },
                        transformMat3: function (e) {
                          return pe.transformMat3(this.array, this.array, e.array), this._dirty = !0, this
                        },
                        transformMat4: function (e) {
                          return pe.transformMat4(this.array, this.array, e.array), this._dirty = !0, this
                        },
                        toString: function () {
                          return "[" + Array.prototype.join.call(this.array, ",") + "]"
                        },
                        toArray: function () {
                          return Array.prototype.slice.call(this.array)
                        }
                      }, Object.defineProperty) {
                      var ge = me.prototype;
                      Object.defineProperty(ge, "x", {
                        get: function () {
                          return this.array[0]
                        },
                        set: function (e) {
                          this.array[0] = e, this._dirty = !0
                        }
                      }), Object.defineProperty(ge, "y", {
                        get: function () {
                          return this.array[1]
                        },
                        set: function (e) {
                          this.array[1] = e, this._dirty = !0
                        }
                      })
                    }
                    me.add = function (e, t, r) {
                      return pe.add(e.array, t.array, r.array), e._dirty = !0, e
                    }, me.set = function (e, t, r) {
                      return pe.set(e.array, t, r), e._dirty = !0, e
                    }, me.copy = function (e, t) {
                      return pe.copy(e.array, t.array), e._dirty = !0, e
                    }, me.cross = function (e, t, r) {
                      return pe.cross(e.array, t.array, r.array), e._dirty = !0, e
                    }, me.distance = me.dist = function (e, t) {
                      return pe.distance(e.array, t.array)
                    }, me.divide = me.div = function (e, t, r) {
                      return pe.divide(e.array, t.array, r.array), e._dirty = !0, e
                    }, me.dot = function (e, t) {
                      return pe.dot(e.array, t.array)
                    }, me.len = function (e) {
                      return pe.length(e.array)
                    }, me.lerp = function (e, t, r, i) {
                      return pe.lerp(e.array, t.array, r.array, i), e._dirty = !0, e
                    }, me.min = function (e, t, r) {
                      return pe.min(e.array, t.array, r.array), e._dirty = !0, e
                    }, me.max = function (e, t, r) {
                      return pe.max(e.array, t.array, r.array), e._dirty = !0, e
                    }, me.multiply = me.mul = function (e, t, r) {
                      return pe.multiply(e.array, t.array, r.array), e._dirty = !0, e
                    }, me.negate = function (e, t) {
                      return pe.negate(e.array, t.array), e._dirty = !0, e
                    }, me.normalize = function (e, t) {
                      return pe.normalize(e.array, t.array), e._dirty = !0, e
                    }, me.random = function (e, t) {
                      return pe.random(e.array, t), e._dirty = !0, e
                    }, me.scale = function (e, t, r) {
                      return pe.scale(e.array, t.array, r), e._dirty = !0, e
                    }, me.scaleAndAdd = function (e, t, r, i) {
                      return pe.scaleAndAdd(e.array, t.array, r.array, i), e._dirty = !0, e
                    }, me.squaredDistance = me.sqrDist = function (e, t) {
                      return pe.sqrDist(e.array, t.array)
                    }, me.squaredLength = me.sqrLen = function (e) {
                      return pe.sqrLen(e.array)
                    }, me.subtract = me.sub = function (e, t, r) {
                      return pe.subtract(e.array, t.array, r.array), e._dirty = !0, e
                    }, me.transformMat2 = function (e, t, r) {
                      return pe.transformMat2(e.array, t.array, r.array), e._dirty = !0, e
                    }, me.transformMat2d = function (e, t, r) {
                      return pe.transformMat2d(e.array, t.array, r.array), e._dirty = !0, e
                    }, me.transformMat3 = function (e, t, r) {
                      return pe.transformMat3(e.array, t.array, r.array), e._dirty = !0, e
                    }, me.transformMat4 = function (e, t, r) {
                      return pe.transformMat4(e.array, t.array, r.array), e._dirty = !0, e
                    };
                    const _e = me;
                    var ve = {};

                    function ye(e) {
                      for (var t = e.split("\n"), r = 0, i = t.length; r < i; r++) t[r] = r + 1 + ": " + t[r];
                      return t.join("\n")
                    }

                    function xe(e, t, r) {
                      if (!e.getShaderParameter(t, e.COMPILE_STATUS)) return [e.getShaderInfoLog(t), ye(r)].join("\n")
                    }
                    var be = new U.Float32Array(16);
                    const we = m.extend({
                      uniformSemantics: {},
                      attributes: {}
                    }, (function () {
                      this._locations = {}, this._textureSlot = 0, this._program = null
                    }), {
                      bind: function (e) {
                        this._textureSlot = 0, e.gl.useProgram(this._program)
                      },
                      hasUniform: function (e) {
                        return null != this._locations[e]
                      },
                      useTextureSlot: function (e, t, r) {
                        t && (e.gl.activeTexture(e.gl.TEXTURE0 + r), t.isRenderable() ? t.bind(e) : t.unbind(e))
                      },
                      currentTextureSlot: function () {
                        return this._textureSlot
                      },
                      resetTextureSlot: function (e) {
                        this._textureSlot = e || 0
                      },
                      takeCurrentTextureSlot: function (e, t) {
                        var r = this._textureSlot;
                        return this.useTextureSlot(e, t, r), this._textureSlot++, r
                      },
                      setUniform: function (e, t, r, i) {
                        var n = this._locations[r];
                        if (null == n) return !1;
                        switch (t) {
                          case "m4":
                            if (!(i instanceof Float32Array)) {
                              for (var a = 0; a < i.length; a++) be[a] = i[a];
                              i = be
                            }
                            e.uniformMatrix4fv(n, !1, i);
                            break;
                          case "2i":
                            e.uniform2i(n, i[0], i[1]);
                            break;
                          case "2f":
                            e.uniform2f(n, i[0], i[1]);
                            break;
                          case "3i":
                            e.uniform3i(n, i[0], i[1], i[2]);
                            break;
                          case "3f":
                            e.uniform3f(n, i[0], i[1], i[2]);
                            break;
                          case "4i":
                            e.uniform4i(n, i[0], i[1], i[2], i[3]);
                            break;
                          case "4f":
                            e.uniform4f(n, i[0], i[1], i[2], i[3]);
                            break;
                          case "1i":
                            e.uniform1i(n, i);
                            break;
                          case "1f":
                            e.uniform1f(n, i);
                            break;
                          case "1fv":
                            e.uniform1fv(n, i);
                            break;
                          case "1iv":
                            e.uniform1iv(n, i);
                            break;
                          case "2iv":
                            e.uniform2iv(n, i);
                            break;
                          case "2fv":
                            e.uniform2fv(n, i);
                            break;
                          case "3iv":
                            e.uniform3iv(n, i);
                            break;
                          case "3fv":
                            e.uniform3fv(n, i);
                            break;
                          case "4iv":
                            e.uniform4iv(n, i);
                            break;
                          case "4fv":
                            e.uniform4fv(n, i);
                            break;
                          case "m2":
                          case "m2v":
                            e.uniformMatrix2fv(n, !1, i);
                            break;
                          case "m3":
                          case "m3v":
                            e.uniformMatrix3fv(n, !1, i);
                            break;
                          case "m4v":
                            if (Array.isArray(i) && Array.isArray(i[0])) {
                              var o = new U.Float32Array(16 * i.length),
                                s = 0;
                              for (a = 0; a < i.length; a++)
                                for (var l = i[a], h = 0; h < 16; h++) o[s++] = l[h];
                              e.uniformMatrix4fv(n, !1, o)
                            } else e.uniformMatrix4fv(n, !1, i)
                        }
                        return !0
                      },
                      setUniformOfSemantic: function (e, t, r) {
                        var i = this.uniformSemantics[t];
                        return !!i && this.setUniform(e, i.type, i.symbol, r)
                      },
                      enableAttributes: function (e, t, r) {
                        var i, n = e.gl,
                          a = this._program,
                          o = this._locations;
                        (i = r ? r.__enabledAttributeList : ve[e.__uid__]) || (i = r ? r.__enabledAttributeList = [] : ve[e.__uid__] = []);
                        for (var s = [], l = 0; l < t.length; l++) {
                          var h = t[l];
                          if (this.attributes[h]) {
                            var u = o[h];
                            if (null == u) {
                              if (-1 === (u = n.getAttribLocation(a, h))) {
                                s[l] = -1;
                                continue
                              }
                              o[h] = u
                            }
                            s[l] = u, i[u] ? i[u] = 2 : i[u] = 1
                          } else s[l] = -1
                        }
                        for (l = 0; l < i.length; l++) switch (i[l]) {
                          case 1:
                            n.enableVertexAttribArray(l), i[l] = 3;
                            break;
                          case 2:
                            i[l] = 3;
                            break;
                          case 3:
                            n.disableVertexAttribArray(l), i[l] = 0
                        }
                        return s
                      },
                      getAttribLocation: function (e, t) {
                        var r = this._locations,
                          i = r[t];
                        return null == i && (i = e.getAttribLocation(this._program, t), r[t] = i), i
                      },
                      buildProgram: function (e, t, r, i) {
                        var n = e.createShader(e.VERTEX_SHADER),
                          a = e.createProgram();
                        e.shaderSource(n, r), e.compileShader(n);
                        var o = e.createShader(e.FRAGMENT_SHADER);
                        e.shaderSource(o, i), e.compileShader(o);
                        var s = xe(e, n, r);
                        if (s) return s;
                        if (s = xe(e, o, i)) return s;
                        if (e.attachShader(a, n), e.attachShader(a, o), t.attributeSemantics.POSITION) e.bindAttribLocation(a, 0, t.attributeSemantics.POSITION.symbol);
                        else {
                          var l = Object.keys(this.attributes);
                          e.bindAttribLocation(a, 0, l[0])
                        }
                        if (e.linkProgram(a), e.deleteShader(n), e.deleteShader(o), this._program = a, this.vertexCode = r, this.fragmentCode = i, !e.getProgramParameter(a, e.LINK_STATUS)) return "Could not link program\n" + e.getProgramInfoLog(a);
                        for (var h = 0; h < t.uniforms.length; h++) {
                          var u = t.uniforms[h];
                          this._locations[u] = e.getUniformLocation(a, u)
                        }
                      }
                    });
                    var Te = /for\s*?\(int\s*?_idx_\s*\=\s*([\w-]+)\;\s*_idx_\s*<\s*([\w-]+);\s*_idx_\s*\+\+\s*\)\s*\{\{([\s\S]+?)(?=\}\})\}\}/g;

                    function Se(e, t, r) {
                      var i = {};
                      for (var n in r) i[n + "_COUNT"] = r[n];
                      return e.replace(Te, (function (e, r, n, a) {
                        var o = "";
                        isNaN(r) && (r = r in t ? t[r] : i[r]), isNaN(n) && (n = n in t ? t[n] : i[n]);
                        for (var s = parseInt(r); s < parseInt(n); s++) o += "{" + a.replace(/float\s*\(\s*_idx_\s*\)/g, s.toFixed(1)).replace(/_idx_/g, s) + "}";
                        return o
                      }))
                    }

                    function Me(e, t, r) {
                      var i = [];
                      if (t)
                        for (var n in t) {
                          var a = t[n];
                          a > 0 && i.push("#define " + n.toUpperCase() + "_COUNT " + a)
                        }
                      if (r)
                        for (var o = 0; o < r.length; o++) {
                          var s = r[o];
                          i.push("#define " + s.toUpperCase() + "_ENABLED")
                        }
                      for (var s in e) {
                        var l = e[s];
                        null === l ? i.push("#define " + s) : i.push("#define " + s + " " + l.toString())
                      }
                      return i.join("\n")
                    }

                    function Ae(e) {
                      this._renderer = e, this._cache = {}
                    }
                    Ae.prototype.getProgram = function (e, t, r) {
                      var i = this._cache,
                        n = e.isSkinnedMesh && e.isSkinnedMesh(),
                        a = e.isInstancedMesh && e.isInstancedMesh(),
                        o = "s" + t.shader.shaderID + "m" + t.getProgramKey();
                      if (r && (o += "se" + r.getProgramKey(e.lightGroup)), n && (o += ",sk" + e.joints.length), a && (o += ",is"), v = i[o]) return v;
                      var s = r ? r.getLightsNumbers(e.lightGroup) : {},
                        l = this._renderer,
                        h = l.gl,
                        u = t.getEnabledTextures(),
                        c = "";
                      if (n) {
                        var d = {
                          SKINNING: null,
                          JOINT_COUNT: e.joints.length
                        };
                        e.joints.length > l.getMaxJointNumber() && (d.USE_SKIN_MATRICES_TEXTURE = null), c += "\n" + Me(d) + "\n"
                      }
                      a && (c += "\n#define INSTANCING\n");
                      var f = c + Me(t.vertexDefines, s, u),
                        p = c + Me(t.fragmentDefines, s, u),
                        m = f + "\n" + t.shader.vertex,
                        g = ["OES_standard_derivatives", "EXT_shader_texture_lod"].filter((function (e) {
                          return null != l.getGLExtension(e)
                        }));
                      g.indexOf("EXT_shader_texture_lod") >= 0 && (p += "\n#define SUPPORT_TEXTURE_LOD"), g.indexOf("OES_standard_derivatives") >= 0 && (p += "\n#define SUPPORT_STANDARD_DERIVATIVES");
                      var _, v, y = function (e) {
                          for (var t = [], r = 0; r < e.length; r++) t.push("#extension GL_" + e[r] + " : enable");
                          return t.join("\n")
                        }(g) + "\n" + ["precision", _ = t.precision, "float"].join(" ") + ";\n" + ["precision", _, "int"].join(" ") + ";\n" + ["precision", _, "sampler2D"].join(" ") + ";\n\n" + p + "\n" + t.shader.fragment,
                        x = Se(m, t.vertexDefines, s),
                        b = Se(y, t.fragmentDefines, s);
                      (v = new we).uniformSemantics = t.shader.uniformSemantics, v.attributes = t.shader.attributes;
                      var w = v.buildProgram(h, t.shader, x, b);
                      return v.__error = w, i[o] = v, v
                    };
                    const Ee = Ae;
                    var Ce = /uniform\s+(bool|float|int|vec2|vec3|vec4|ivec2|ivec3|ivec4|mat2|mat3|mat4|sampler2D|samplerCube)\s+([\s\S]*?);/g,
                      De = /attribute\s+(float|int|vec2|vec3|vec4)\s+([\s\S]*?);/g,
                      Le = /#define\s+(\w+)?(\s+[\d-.]+)?\s*;?\s*\n/g,
                      Pe = {
                        bool: "1i",
                        int: "1i",
                        sampler2D: "t",
                        samplerCube: "t",
                        float: "1f",
                        vec2: "2f",
                        vec3: "3f",
                        vec4: "4f",
                        ivec2: "2i",
                        ivec3: "3i",
                        ivec4: "4i",
                        mat2: "m2",
                        mat3: "m3",
                        mat4: "m4"
                      };

                    function Oe(e) {
                      for (var t = [], r = 0; r < e; r++) t[r] = 0;
                      return t
                    }
                    var Ne = {
                        bool: function () {
                          return !0
                        },
                        int: function () {
                          return 0
                        },
                        float: function () {
                          return 0
                        },
                        sampler2D: function () {
                          return null
                        },
                        samplerCube: function () {
                          return null
                        },
                        vec2: function () {
                          return Oe(2)
                        },
                        vec3: function () {
                          return Oe(3)
                        },
                        vec4: function () {
                          return Oe(4)
                        },
                        ivec2: function () {
                          return Oe(2)
                        },
                        ivec3: function () {
                          return Oe(3)
                        },
                        ivec4: function () {
                          return Oe(4)
                        },
                        mat2: function () {
                          return Oe(4)
                        },
                        mat3: function () {
                          return Oe(9)
                        },
                        mat4: function () {
                          return Oe(16)
                        },
                        array: function () {
                          return []
                        }
                      },
                      Ie = ["POSITION", "NORMAL", "BINORMAL", "TANGENT", "TEXCOORD", "TEXCOORD_0", "TEXCOORD_1", "COLOR", "JOINT", "WEIGHT"],
                      Re = ["SKIN_MATRIX", "VIEWPORT_SIZE", "VIEWPORT", "DEVICEPIXELRATIO", "WINDOW_SIZE", "NEAR", "FAR", "TIME"],
                      Be = ["WORLD", "VIEW", "PROJECTION", "WORLDVIEW", "VIEWPROJECTION", "WORLDVIEWPROJECTION", "WORLDINVERSE", "VIEWINVERSE", "PROJECTIONINVERSE", "WORLDVIEWINVERSE", "VIEWPROJECTIONINVERSE", "WORLDVIEWPROJECTIONINVERSE", "WORLDTRANSPOSE", "VIEWTRANSPOSE", "PROJECTIONTRANSPOSE", "WORLDVIEWTRANSPOSE", "VIEWPROJECTIONTRANSPOSE", "WORLDVIEWPROJECTIONTRANSPOSE", "WORLDINVERSETRANSPOSE", "VIEWINVERSETRANSPOSE", "PROJECTIONINVERSETRANSPOSE", "WORLDVIEWINVERSETRANSPOSE", "VIEWPROJECTIONINVERSETRANSPOSE", "WORLDVIEWPROJECTIONINVERSETRANSPOSE"],
                      Fe = {
                        vec4: 4,
                        vec3: 3,
                        vec2: 2,
                        float: 1
                      },
                      ze = {},
                      Ge = {};

                    function Ue(e) {
                      return e.replace(/[ \t]*\/\/.*\n/g, "").replace(/[ \t]*\/\*[\s\S]*?\*\//g, "")
                    }

                    function ke() {
                      console.error("Wrong uniform/attributes syntax")
                    }

                    function Ve(e, t) {
                      for (var r = /[,=\(\):]/, i = t.replace(/:\s*\[\s*(.*)\s*\]/g, "=" + e + "($1)").replace(/\s+/g, "").split(/(?=[,=\(\):])/g), n = [], a = 0; a < i.length; a++) i[a].match(r) ? n.push(i[a].charAt(0), i[a].slice(1)) : n.push(i[a]);
                      var o, s = 0,
                        l = {},
                        h = null;

                      function u(e) {
                        e || ke();
                        var t = e.match(/\[(.*?)\]/);
                        o = e.replace(/\[(.*?)\]/, ""), l[o] = {}, t && (l[o].isArray = !0, l[o].arraySize = t[1])
                      }
                      for (u((i = n)[0]), a = 1; a < i.length; a++) {
                        var c = i[a];
                        if (c)
                          if ("=" !== c)
                            if (":" !== c)
                              if ("," !== c)
                                if (")" !== c)
                                  if ("(" !== c)
                                    if (c.indexOf("vec") >= 0) {
                                      if (1 !== s && 4 !== s) {
                                        ke();
                                        break
                                      }
                                      s = 2, h = []
                                    } else if (1 !== s)
                          if (4 !== s) u(c), s = 0;
                          else {
                            var d = c;
                            Ie.indexOf(d) >= 0 || Re.indexOf(d) >= 0 || Be.indexOf(d) >= 0 ? l[o].semantic = d : "ignore" === d || "unconfigurable" === d ? l[o].ignore = !0 : l[o].value = "bool" === e ? "true" === d : parseFloat(d)
                          }
                        else l[o].value = "bool" === e ? "true" === c : parseFloat(c), h = null;
                        else {
                          if (2 !== s) {
                            ke();
                            break
                          }
                          if (!(h instanceof Array)) {
                            ke();
                            break
                          }
                          h.push(+i[++a])
                        } else l[o].value = new U.Float32Array(h), h = null, s = 5;
                        else if (2 === s) {
                          if (!(h instanceof Array)) {
                            ke();
                            break
                          }
                          h.push(+i[++a])
                        } else s = 5;
                        else s = 4;
                        else {
                          if (0 !== s && 3 !== s) {
                            ke();
                            break
                          }
                          s = 1
                        }
                      }
                      return l
                    }

                    function He(e, t) {
                      "object" == typeof e && (t = e.fragment, e = e.vertex), e = Ue(e), t = Ue(t), this._shaderID = function (e, t) {
                        var r = "vertex:" + e + "fragment:" + t;
                        if (ze[r]) return ze[r];
                        var i = f.genGUID();
                        return ze[r] = i, Ge[i] = {
                          vertex: e,
                          fragment: t
                        }, i
                      }(e, t), this._vertexCode = He.parseImport(e), this._fragmentCode = He.parseImport(t), this.attributeSemantics = {}, this.matrixSemantics = {}, this.uniformSemantics = {}, this.matrixSemanticKeys = [], this.uniformTemplates = {}, this.attributes = {}, this.textures = {}, this.vertexDefines = {}, this.fragmentDefines = {}, this._parseAttributes(), this._parseUniforms(), this._parseDefines()
                    }
                    He.prototype = {
                      constructor: He,
                      createUniforms: function () {
                        var e = {};
                        for (var t in this.uniformTemplates) {
                          var r = this.uniformTemplates[t];
                          e[t] = {
                            type: r.type,
                            value: r.value()
                          }
                        }
                        return e
                      },
                      _parseImport: function () {
                        this._vertexCode = He.parseImport(this.vertex), this._fragmentCode = He.parseImport(this.fragment)
                      },
                      _addSemanticUniform: function (e, t, r) {
                        if (Ie.indexOf(r) >= 0) this.attributeSemantics[r] = {
                          symbol: e,
                          type: t
                        };
                        else if (Be.indexOf(r) >= 0) {
                          var i = !1,
                            n = r;
                          r.match(/TRANSPOSE$/) && (i = !0, n = r.slice(0, -9)), this.matrixSemantics[r] = {
                            symbol: e,
                            type: t,
                            isTranspose: i,
                            semanticNoTranspose: n
                          }
                        } else Re.indexOf(r) >= 0 && (this.uniformSemantics[r] = {
                          symbol: e,
                          type: t
                        })
                      },
                      _addMaterialUniform: function (e, t, r, i, n, a) {
                        a[e] = {
                          type: r,
                          value: n ? Ne.array : i || Ne[t],
                          semantic: null
                        }
                      },
                      _parseUniforms: function () {
                        var e = {},
                          t = this;

                        function r(e) {
                          return null != e ? function () {
                            return e
                          } : null
                        }

                        function i(i, n, a) {
                          var o = Ve(n, a),
                            s = [];
                          for (var l in o) {
                            var h = o[l],
                              u = h.semantic,
                              c = l,
                              d = Pe[n],
                              f = r(o[l].value);
                            o[l].isArray && (c += "[" + o[l].arraySize + "]", d += "v"), s.push(c), t._uniformList.push(l), h.ignore || ("sampler2D" !== n && "samplerCube" !== n || (t.textures[l] = {
                              shaderType: "fragment",
                              type: n
                            }), u ? t._addSemanticUniform(l, d, u) : t._addMaterialUniform(l, n, d, f, o[l].isArray, e))
                          }
                          return s.length > 0 ? "uniform " + n + " " + s.join(",") + ";\n" : ""
                        }
                        this._uniformList = [], this._vertexCode = this._vertexCode.replace(Ce, i), this._fragmentCode = this._fragmentCode.replace(Ce, i), t.matrixSemanticKeys = Object.keys(this.matrixSemantics), this.uniformTemplates = e
                      },
                      _parseAttributes: function () {
                        var e = {},
                          t = this;
                        this._vertexCode = this._vertexCode.replace(De, (function (r, i, n) {
                          var a = Ve(i, n),
                            o = Fe[i] || 1,
                            s = [];
                          for (var l in a) {
                            var h = a[l].semantic;
                            if (e[l] = {
                                type: "float",
                                size: o,
                                semantic: h || null
                              }, h) {
                              if (Ie.indexOf(h) < 0) throw new Error('Unkown semantic "' + h + '"');
                              t.attributeSemantics[h] = {
                                symbol: l,
                                type: i
                              }
                            }
                            s.push(l)
                          }
                          return "attribute " + i + " " + s.join(",") + ";\n"
                        })), this.attributes = e
                      },
                      _parseDefines: function () {
                        var e = this;

                        function t(t, r, i) {
                          var n = e.fragmentDefines;
                          return n[r] || (n[r] = "false" !== i && ("true" === i || (i ? isNaN(parseFloat(i)) ? i.trim() : parseFloat(i) : null))), ""
                        }
                        this._vertexCode = this._vertexCode.replace(Le, t), this._fragmentCode = this._fragmentCode.replace(Le, t)
                      },
                      clone: function () {
                        var e = Ge[this._shaderID];
                        return new He(e.vertex, e.fragment)
                      }
                    }, Object.defineProperty && (Object.defineProperty(He.prototype, "shaderID", {
                      get: function () {
                        return this._shaderID
                      }
                    }), Object.defineProperty(He.prototype, "vertex", {
                      get: function () {
                        return this._vertexCode
                      }
                    }), Object.defineProperty(He.prototype, "fragment", {
                      get: function () {
                        return this._fragmentCode
                      }
                    }), Object.defineProperty(He.prototype, "uniforms", {
                      get: function () {
                        return this._uniformList
                      }
                    }));
                    var We = /(@import)\s*([0-9a-zA-Z_\-\.]*)/g;
                    He.parseImport = function (e) {
                      return e.replace(We, (function (e, t, r) {
                        return (e = He.source(r)) ? He.parseImport(e) : (console.error('Shader chunk "' + r + '" not existed in library'), "")
                      }))
                    };
                    var je = /(@export)\s*([0-9a-zA-Z_\-\.]*)\s*\n([\s\S]*?)@end/g;
                    He.import = function (e) {
                      e.replace(je, (function (e, t, r, i) {
                        if (i = i.replace(/(^[\s\t\xa0\u3000]+)|([\u3000\xa0\s\t]+\x24)/g, "")) {
                          for (var n, a = r.split("."), o = He.codes, s = 0; s < a.length - 1;) o[n = a[s++]] || (o[n] = {}), o = o[n];
                          o[n = a[s]] = i
                        }
                        return i
                      }))
                    }, He.codes = {}, He.source = function (e) {
                      for (var t = e.split("."), r = He.codes, i = 0; r && i < t.length;) r = r[t[i++]];
                      return "string" != typeof r ? (console.error('Shader "' + e + '" not existed in library'), "") : r
                    };
                    const Xe = He,
                      qe = "@export clay.prez.vertex\nuniform mat4 WVP : WORLDVIEWPROJECTION;\nattribute vec3 pos : POSITION;\nattribute vec2 uv : TEXCOORD_0;\nuniform vec2 uvRepeat : [1.0, 1.0];\nuniform vec2 uvOffset : [0.0, 0.0];\n@import clay.chunk.skinning_header\n@import clay.chunk.instancing_header\nvarying vec2 v_Texcoord;\nvoid main()\n{\n vec4 P = vec4(pos, 1.0);\n#ifdef SKINNING\n @import clay.chunk.skin_matrix\n P = skinMatrixWS * P;\n#endif\n#ifdef INSTANCING\n @import clay.chunk.instancing_matrix\n P = instanceMat * P;\n#endif\n gl_Position = WVP * P;\n v_Texcoord = uv * uvRepeat + uvOffset;\n}\n@end\n@export clay.prez.fragment\nuniform sampler2D alphaMap;\nuniform float alphaCutoff: 0.0;\nvarying vec2 v_Texcoord;\nvoid main()\n{\n if (alphaCutoff > 0.0) {\n if (texture2D(alphaMap, v_Texcoord).a <= alphaCutoff) {\n discard;\n }\n }\n gl_FragColor = vec4(0.0,0.0,0.0,1.0);\n}\n@end";
                    var Ze = {
                      create: function () {
                        var e = new ce(16);
                        return e[0] = 1, e[1] = 0, e[2] = 0, e[3] = 0, e[4] = 0, e[5] = 1, e[6] = 0, e[7] = 0, e[8] = 0, e[9] = 0, e[10] = 1, e[11] = 0, e[12] = 0, e[13] = 0, e[14] = 0, e[15] = 1, e
                      },
                      clone: function (e) {
                        var t = new ce(16);
                        return t[0] = e[0], t[1] = e[1], t[2] = e[2], t[3] = e[3], t[4] = e[4], t[5] = e[5], t[6] = e[6], t[7] = e[7], t[8] = e[8], t[9] = e[9], t[10] = e[10], t[11] = e[11], t[12] = e[12], t[13] = e[13], t[14] = e[14], t[15] = e[15], t
                      },
                      copy: function (e, t) {
                        return e[0] = t[0], e[1] = t[1], e[2] = t[2], e[3] = t[3], e[4] = t[4], e[5] = t[5], e[6] = t[6], e[7] = t[7], e[8] = t[8], e[9] = t[9], e[10] = t[10], e[11] = t[11], e[12] = t[12], e[13] = t[13], e[14] = t[14], e[15] = t[15], e
                      },
                      identity: function (e) {
                        return e[0] = 1, e[1] = 0, e[2] = 0, e[3] = 0, e[4] = 0, e[5] = 1, e[6] = 0, e[7] = 0, e[8] = 0, e[9] = 0, e[10] = 1, e[11] = 0, e[12] = 0, e[13] = 0, e[14] = 0, e[15] = 1, e
                      },
                      transpose: function (e, t) {
                        if (e === t) {
                          var r = t[1],
                            i = t[2],
                            n = t[3],
                            a = t[6],
                            o = t[7],
                            s = t[11];
                          e[1] = t[4], e[2] = t[8], e[3] = t[12], e[4] = r, e[6] = t[9], e[7] = t[13], e[8] = i, e[9] = a, e[11] = t[14], e[12] = n, e[13] = o, e[14] = s
                        } else e[0] = t[0], e[1] = t[4], e[2] = t[8], e[3] = t[12], e[4] = t[1], e[5] = t[5], e[6] = t[9], e[7] = t[13], e[8] = t[2], e[9] = t[6], e[10] = t[10], e[11] = t[14], e[12] = t[3], e[13] = t[7], e[14] = t[11], e[15] = t[15];
                        return e
                      },
                      invert: function (e, t) {
                        var r = t[0],
                          i = t[1],
                          n = t[2],
                          a = t[3],
                          o = t[4],
                          s = t[5],
                          l = t[6],
                          h = t[7],
                          u = t[8],
                          c = t[9],
                          d = t[10],
                          f = t[11],
                          p = t[12],
                          m = t[13],
                          g = t[14],
                          _ = t[15],
                          v = r * s - i * o,
                          y = r * l - n * o,
                          x = r * h - a * o,
                          b = i * l - n * s,
                          w = i * h - a * s,
                          T = n * h - a * l,
                          S = u * m - c * p,
                          M = u * g - d * p,
                          A = u * _ - f * p,
                          E = c * g - d * m,
                          C = c * _ - f * m,
                          D = d * _ - f * g,
                          L = v * D - y * C + x * E + b * A - w * M + T * S;
                        return L ? (L = 1 / L, e[0] = (s * D - l * C + h * E) * L, e[1] = (n * C - i * D - a * E) * L, e[2] = (m * T - g * w + _ * b) * L, e[3] = (d * w - c * T - f * b) * L, e[4] = (l * A - o * D - h * M) * L, e[5] = (r * D - n * A + a * M) * L, e[6] = (g * x - p * T - _ * y) * L, e[7] = (u * T - d * x + f * y) * L, e[8] = (o * C - s * A + h * S) * L, e[9] = (i * A - r * C - a * S) * L, e[10] = (p * w - m * x + _ * v) * L, e[11] = (c * x - u * w - f * v) * L, e[12] = (s * M - o * E - l * S) * L, e[13] = (r * E - i * M + n * S) * L, e[14] = (m * y - p * b - g * v) * L, e[15] = (u * b - c * y + d * v) * L, e) : null
                      },
                      adjoint: function (e, t) {
                        var r = t[0],
                          i = t[1],
                          n = t[2],
                          a = t[3],
                          o = t[4],
                          s = t[5],
                          l = t[6],
                          h = t[7],
                          u = t[8],
                          c = t[9],
                          d = t[10],
                          f = t[11],
                          p = t[12],
                          m = t[13],
                          g = t[14],
                          _ = t[15];
                        return e[0] = s * (d * _ - f * g) - c * (l * _ - h * g) + m * (l * f - h * d), e[1] = -(i * (d * _ - f * g) - c * (n * _ - a * g) + m * (n * f - a * d)), e[2] = i * (l * _ - h * g) - s * (n * _ - a * g) + m * (n * h - a * l), e[3] = -(i * (l * f - h * d) - s * (n * f - a * d) + c * (n * h - a * l)), e[4] = -(o * (d * _ - f * g) - u * (l * _ - h * g) + p * (l * f - h * d)), e[5] = r * (d * _ - f * g) - u * (n * _ - a * g) + p * (n * f - a * d), e[6] = -(r * (l * _ - h * g) - o * (n * _ - a * g) + p * (n * h - a * l)), e[7] = r * (l * f - h * d) - o * (n * f - a * d) + u * (n * h - a * l), e[8] = o * (c * _ - f * m) - u * (s * _ - h * m) + p * (s * f - h * c), e[9] = -(r * (c * _ - f * m) - u * (i * _ - a * m) + p * (i * f - a * c)), e[10] = r * (s * _ - h * m) - o * (i * _ - a * m) + p * (i * h - a * s), e[11] = -(r * (s * f - h * c) - o * (i * f - a * c) + u * (i * h - a * s)), e[12] = -(o * (c * g - d * m) - u * (s * g - l * m) + p * (s * d - l * c)), e[13] = r * (c * g - d * m) - u * (i * g - n * m) + p * (i * d - n * c), e[14] = -(r * (s * g - l * m) - o * (i * g - n * m) + p * (i * l - n * s)), e[15] = r * (s * d - l * c) - o * (i * d - n * c) + u * (i * l - n * s), e
                      },
                      determinant: function (e) {
                        var t = e[0],
                          r = e[1],
                          i = e[2],
                          n = e[3],
                          a = e[4],
                          o = e[5],
                          s = e[6],
                          l = e[7],
                          h = e[8],
                          u = e[9],
                          c = e[10],
                          d = e[11],
                          f = e[12],
                          p = e[13],
                          m = e[14],
                          g = e[15];
                        return (t * o - r * a) * (c * g - d * m) - (t * s - i * a) * (u * g - d * p) + (t * l - n * a) * (u * m - c * p) + (r * s - i * o) * (h * g - d * f) - (r * l - n * o) * (h * m - c * f) + (i * l - n * s) * (h * p - u * f)
                      },
                      multiply: function (e, t, r) {
                        var i = t[0],
                          n = t[1],
                          a = t[2],
                          o = t[3],
                          s = t[4],
                          l = t[5],
                          h = t[6],
                          u = t[7],
                          c = t[8],
                          d = t[9],
                          f = t[10],
                          p = t[11],
                          m = t[12],
                          g = t[13],
                          _ = t[14],
                          v = t[15],
                          y = r[0],
                          x = r[1],
                          b = r[2],
                          w = r[3];
                        return e[0] = y * i + x * s + b * c + w * m, e[1] = y * n + x * l + b * d + w * g, e[2] = y * a + x * h + b * f + w * _, e[3] = y * o + x * u + b * p + w * v, y = r[4], x = r[5], b = r[6], w = r[7], e[4] = y * i + x * s + b * c + w * m, e[5] = y * n + x * l + b * d + w * g, e[6] = y * a + x * h + b * f + w * _, e[7] = y * o + x * u + b * p + w * v, y = r[8], x = r[9], b = r[10], w = r[11], e[8] = y * i + x * s + b * c + w * m, e[9] = y * n + x * l + b * d + w * g, e[10] = y * a + x * h + b * f + w * _, e[11] = y * o + x * u + b * p + w * v, y = r[12], x = r[13], b = r[14], w = r[15], e[12] = y * i + x * s + b * c + w * m, e[13] = y * n + x * l + b * d + w * g, e[14] = y * a + x * h + b * f + w * _, e[15] = y * o + x * u + b * p + w * v, e
                      },
                      multiplyAffine: function (e, t, r) {
                        var i = t[0],
                          n = t[1],
                          a = t[2],
                          o = t[4],
                          s = t[5],
                          l = t[6],
                          h = t[8],
                          u = t[9],
                          c = t[10],
                          d = t[12],
                          f = t[13],
                          p = t[14],
                          m = r[0],
                          g = r[1],
                          _ = r[2];
                        return e[0] = m * i + g * o + _ * h, e[1] = m * n + g * s + _ * u, e[2] = m * a + g * l + _ * c, m = r[4], g = r[5], _ = r[6], e[4] = m * i + g * o + _ * h, e[5] = m * n + g * s + _ * u, e[6] = m * a + g * l + _ * c, m = r[8], g = r[9], _ = r[10], e[8] = m * i + g * o + _ * h, e[9] = m * n + g * s + _ * u, e[10] = m * a + g * l + _ * c, m = r[12], g = r[13], _ = r[14], e[12] = m * i + g * o + _ * h + d, e[13] = m * n + g * s + _ * u + f, e[14] = m * a + g * l + _ * c + p, e
                      }
                    };
                    Ze.mul = Ze.multiply, Ze.mulAffine = Ze.multiplyAffine, Ze.translate = function (e, t, r) {
                      var i, n, a, o, s, l, h, u, c, d, f, p, m = r[0],
                        g = r[1],
                        _ = r[2];
                      return t === e ? (e[12] = t[0] * m + t[4] * g + t[8] * _ + t[12], e[13] = t[1] * m + t[5] * g + t[9] * _ + t[13], e[14] = t[2] * m + t[6] * g + t[10] * _ + t[14], e[15] = t[3] * m + t[7] * g + t[11] * _ + t[15]) : (i = t[0], n = t[1], a = t[2], o = t[3], s = t[4], l = t[5], h = t[6], u = t[7], c = t[8], d = t[9], f = t[10], p = t[11], e[0] = i, e[1] = n, e[2] = a, e[3] = o, e[4] = s, e[5] = l, e[6] = h, e[7] = u, e[8] = c, e[9] = d, e[10] = f, e[11] = p, e[12] = i * m + s * g + c * _ + t[12], e[13] = n * m + l * g + d * _ + t[13], e[14] = a * m + h * g + f * _ + t[14], e[15] = o * m + u * g + p * _ + t[15]), e
                    }, Ze.scale = function (e, t, r) {
                      var i = r[0],
                        n = r[1],
                        a = r[2];
                      return e[0] = t[0] * i, e[1] = t[1] * i, e[2] = t[2] * i, e[3] = t[3] * i, e[4] = t[4] * n, e[5] = t[5] * n, e[6] = t[6] * n, e[7] = t[7] * n, e[8] = t[8] * a, e[9] = t[9] * a, e[10] = t[10] * a, e[11] = t[11] * a, e[12] = t[12], e[13] = t[13], e[14] = t[14], e[15] = t[15], e
                    }, Ze.rotate = function (e, t, r, i) {
                      var n, a, o, s, l, h, u, c, d, f, p, m, g, _, v, y, x, b, w, T, S, M, A, E, C = i[0],
                        D = i[1],
                        L = i[2],
                        P = Math.sqrt(C * C + D * D + L * L);
                      return Math.abs(P) < ue ? null : (C *= P = 1 / P, D *= P, L *= P, n = Math.sin(r), o = 1 - (a = Math.cos(r)), s = t[0], l = t[1], h = t[2], u = t[3], c = t[4], d = t[5], f = t[6], p = t[7], m = t[8], g = t[9], _ = t[10], v = t[11], y = C * C * o + a, x = D * C * o + L * n, b = L * C * o - D * n, w = C * D * o - L * n, T = D * D * o + a, S = L * D * o + C * n, M = C * L * o + D * n, A = D * L * o - C * n, E = L * L * o + a, e[0] = s * y + c * x + m * b, e[1] = l * y + d * x + g * b, e[2] = h * y + f * x + _ * b, e[3] = u * y + p * x + v * b, e[4] = s * w + c * T + m * S, e[5] = l * w + d * T + g * S, e[6] = h * w + f * T + _ * S, e[7] = u * w + p * T + v * S, e[8] = s * M + c * A + m * E, e[9] = l * M + d * A + g * E, e[10] = h * M + f * A + _ * E, e[11] = u * M + p * A + v * E, t !== e && (e[12] = t[12], e[13] = t[13], e[14] = t[14], e[15] = t[15]), e)
                    }, Ze.rotateX = function (e, t, r) {
                      var i = Math.sin(r),
                        n = Math.cos(r),
                        a = t[4],
                        o = t[5],
                        s = t[6],
                        l = t[7],
                        h = t[8],
                        u = t[9],
                        c = t[10],
                        d = t[11];
                      return t !== e && (e[0] = t[0], e[1] = t[1], e[2] = t[2], e[3] = t[3], e[12] = t[12], e[13] = t[13], e[14] = t[14], e[15] = t[15]), e[4] = a * n + h * i, e[5] = o * n + u * i, e[6] = s * n + c * i, e[7] = l * n + d * i, e[8] = h * n - a * i, e[9] = u * n - o * i, e[10] = c * n - s * i, e[11] = d * n - l * i, e
                    }, Ze.rotateY = function (e, t, r) {
                      var i = Math.sin(r),
                        n = Math.cos(r),
                        a = t[0],
                        o = t[1],
                        s = t[2],
                        l = t[3],
                        h = t[8],
                        u = t[9],
                        c = t[10],
                        d = t[11];
                      return t !== e && (e[4] = t[4], e[5] = t[5], e[6] = t[6], e[7] = t[7], e[12] = t[12], e[13] = t[13], e[14] = t[14], e[15] = t[15]), e[0] = a * n - h * i, e[1] = o * n - u * i, e[2] = s * n - c * i, e[3] = l * n - d * i, e[8] = a * i + h * n, e[9] = o * i + u * n, e[10] = s * i + c * n, e[11] = l * i + d * n, e
                    }, Ze.rotateZ = function (e, t, r) {
                      var i = Math.sin(r),
                        n = Math.cos(r),
                        a = t[0],
                        o = t[1],
                        s = t[2],
                        l = t[3],
                        h = t[4],
                        u = t[5],
                        c = t[6],
                        d = t[7];
                      return t !== e && (e[8] = t[8], e[9] = t[9], e[10] = t[10], e[11] = t[11], e[12] = t[12], e[13] = t[13], e[14] = t[14], e[15] = t[15]), e[0] = a * n + h * i, e[1] = o * n + u * i, e[2] = s * n + c * i, e[3] = l * n + d * i, e[4] = h * n - a * i, e[5] = u * n - o * i, e[6] = c * n - s * i, e[7] = d * n - l * i, e
                    }, Ze.fromRotationTranslation = function (e, t, r) {
                      var i = t[0],
                        n = t[1],
                        a = t[2],
                        o = t[3],
                        s = i + i,
                        l = n + n,
                        h = a + a,
                        u = i * s,
                        c = i * l,
                        d = i * h,
                        f = n * l,
                        p = n * h,
                        m = a * h,
                        g = o * s,
                        _ = o * l,
                        v = o * h;
                      return e[0] = 1 - (f + m), e[1] = c + v, e[2] = d - _, e[3] = 0, e[4] = c - v, e[5] = 1 - (u + m), e[6] = p + g, e[7] = 0, e[8] = d + _, e[9] = p - g, e[10] = 1 - (u + f), e[11] = 0, e[12] = r[0], e[13] = r[1], e[14] = r[2], e[15] = 1, e
                    }, Ze.fromQuat = function (e, t) {
                      var r = t[0],
                        i = t[1],
                        n = t[2],
                        a = t[3],
                        o = r + r,
                        s = i + i,
                        l = n + n,
                        h = r * o,
                        u = i * o,
                        c = i * s,
                        d = n * o,
                        f = n * s,
                        p = n * l,
                        m = a * o,
                        g = a * s,
                        _ = a * l;
                      return e[0] = 1 - c - p, e[1] = u + _, e[2] = d - g, e[3] = 0, e[4] = u - _, e[5] = 1 - h - p, e[6] = f + m, e[7] = 0, e[8] = d + g, e[9] = f - m, e[10] = 1 - h - c, e[11] = 0, e[12] = 0, e[13] = 0, e[14] = 0, e[15] = 1, e
                    }, Ze.frustum = function (e, t, r, i, n, a, o) {
                      var s = 1 / (r - t),
                        l = 1 / (n - i),
                        h = 1 / (a - o);
                      return e[0] = 2 * a * s, e[1] = 0, e[2] = 0, e[3] = 0, e[4] = 0, e[5] = 2 * a * l, e[6] = 0, e[7] = 0, e[8] = (r + t) * s, e[9] = (n + i) * l, e[10] = (o + a) * h, e[11] = -1, e[12] = 0, e[13] = 0, e[14] = o * a * 2 * h, e[15] = 0, e
                    }, Ze.perspective = function (e, t, r, i, n) {
                      var a = 1 / Math.tan(t / 2),
                        o = 1 / (i - n);
                      return e[0] = a / r, e[1] = 0, e[2] = 0, e[3] = 0, e[4] = 0, e[5] = a, e[6] = 0, e[7] = 0, e[8] = 0, e[9] = 0, e[10] = (n + i) * o, e[11] = -1, e[12] = 0, e[13] = 0, e[14] = 2 * n * i * o, e[15] = 0, e
                    }, Ze.ortho = function (e, t, r, i, n, a, o) {
                      var s = 1 / (t - r),
                        l = 1 / (i - n),
                        h = 1 / (a - o);
                      return e[0] = -2 * s, e[1] = 0, e[2] = 0, e[3] = 0, e[4] = 0, e[5] = -2 * l, e[6] = 0, e[7] = 0, e[8] = 0, e[9] = 0, e[10] = 2 * h, e[11] = 0, e[12] = (t + r) * s, e[13] = (n + i) * l, e[14] = (o + a) * h, e[15] = 1, e
                    }, Ze.lookAt = function (e, t, r, i) {
                      var n, a, o, s, l, h, u, c, d, f, p = t[0],
                        m = t[1],
                        g = t[2],
                        _ = i[0],
                        v = i[1],
                        y = i[2],
                        x = r[0],
                        b = r[1],
                        w = r[2];
                      return Math.abs(p - x) < ue && Math.abs(m - b) < ue && Math.abs(g - w) < ue ? Ze.identity(e) : (u = p - x, c = m - b, d = g - w, n = v * (d *= f = 1 / Math.sqrt(u * u + c * c + d * d)) - y * (c *= f), a = y * (u *= f) - _ * d, o = _ * c - v * u, (f = Math.sqrt(n * n + a * a + o * o)) ? (n *= f = 1 / f, a *= f, o *= f) : (n = 0, a = 0, o = 0), s = c * o - d * a, l = d * n - u * o, h = u * a - c * n, (f = Math.sqrt(s * s + l * l + h * h)) ? (s *= f = 1 / f, l *= f, h *= f) : (s = 0, l = 0, h = 0), e[0] = n, e[1] = s, e[2] = u, e[3] = 0, e[4] = a, e[5] = l, e[6] = c, e[7] = 0, e[8] = o, e[9] = h, e[10] = d, e[11] = 0, e[12] = -(n * p + a * m + o * g), e[13] = -(s * p + l * m + h * g), e[14] = -(u * p + c * m + d * g), e[15] = 1, e)
                    }, Ze.frob = function (e) {
                      return Math.sqrt(Math.pow(e[0], 2) + Math.pow(e[1], 2) + Math.pow(e[2], 2) + Math.pow(e[3], 2) + Math.pow(e[4], 2) + Math.pow(e[5], 2) + Math.pow(e[6], 2) + Math.pow(e[7], 2) + Math.pow(e[8], 2) + Math.pow(e[9], 2) + Math.pow(e[10], 2) + Math.pow(e[11], 2) + Math.pow(e[12], 2) + Math.pow(e[13], 2) + Math.pow(e[14], 2) + Math.pow(e[15], 2))
                    };
                    const Ye = Ze;
                    var Ke = {
                      create: function () {
                        var e = new ce(3);
                        return e[0] = 0, e[1] = 0, e[2] = 0, e
                      },
                      clone: function (e) {
                        var t = new ce(3);
                        return t[0] = e[0], t[1] = e[1], t[2] = e[2], t
                      },
                      fromValues: function (e, t, r) {
                        var i = new ce(3);
                        return i[0] = e, i[1] = t, i[2] = r, i
                      },
                      copy: function (e, t) {
                        return e[0] = t[0], e[1] = t[1], e[2] = t[2], e
                      },
                      set: function (e, t, r, i) {
                        return e[0] = t, e[1] = r, e[2] = i, e
                      },
                      add: function (e, t, r) {
                        return e[0] = t[0] + r[0], e[1] = t[1] + r[1], e[2] = t[2] + r[2], e
                      },
                      subtract: function (e, t, r) {
                        return e[0] = t[0] - r[0], e[1] = t[1] - r[1], e[2] = t[2] - r[2], e
                      }
                    };
                    Ke.sub = Ke.subtract, Ke.multiply = function (e, t, r) {
                      return e[0] = t[0] * r[0], e[1] = t[1] * r[1], e[2] = t[2] * r[2], e
                    }, Ke.mul = Ke.multiply, Ke.divide = function (e, t, r) {
                      return e[0] = t[0] / r[0], e[1] = t[1] / r[1], e[2] = t[2] / r[2], e
                    }, Ke.div = Ke.divide, Ke.min = function (e, t, r) {
                      return e[0] = Math.min(t[0], r[0]), e[1] = Math.min(t[1], r[1]), e[2] = Math.min(t[2], r[2]), e
                    }, Ke.max = function (e, t, r) {
                      return e[0] = Math.max(t[0], r[0]), e[1] = Math.max(t[1], r[1]), e[2] = Math.max(t[2], r[2]), e
                    }, Ke.scale = function (e, t, r) {
                      return e[0] = t[0] * r, e[1] = t[1] * r, e[2] = t[2] * r, e
                    }, Ke.scaleAndAdd = function (e, t, r, i) {
                      return e[0] = t[0] + r[0] * i, e[1] = t[1] + r[1] * i, e[2] = t[2] + r[2] * i, e
                    }, Ke.distance = function (e, t) {
                      var r = t[0] - e[0],
                        i = t[1] - e[1],
                        n = t[2] - e[2];
                      return Math.sqrt(r * r + i * i + n * n)
                    }, Ke.dist = Ke.distance, Ke.squaredDistance = function (e, t) {
                      var r = t[0] - e[0],
                        i = t[1] - e[1],
                        n = t[2] - e[2];
                      return r * r + i * i + n * n
                    }, Ke.sqrDist = Ke.squaredDistance, Ke.length = function (e) {
                      var t = e[0],
                        r = e[1],
                        i = e[2];
                      return Math.sqrt(t * t + r * r + i * i)
                    }, Ke.len = Ke.length, Ke.squaredLength = function (e) {
                      var t = e[0],
                        r = e[1],
                        i = e[2];
                      return t * t + r * r + i * i
                    }, Ke.sqrLen = Ke.squaredLength, Ke.negate = function (e, t) {
                      return e[0] = -t[0], e[1] = -t[1], e[2] = -t[2], e
                    }, Ke.inverse = function (e, t) {
                      return e[0] = 1 / t[0], e[1] = 1 / t[1], e[2] = 1 / t[2], e
                    }, Ke.normalize = function (e, t) {
                      var r = t[0],
                        i = t[1],
                        n = t[2],
                        a = r * r + i * i + n * n;
                      return a > 0 && (a = 1 / Math.sqrt(a), e[0] = t[0] * a, e[1] = t[1] * a, e[2] = t[2] * a), e
                    }, Ke.dot = function (e, t) {
                      return e[0] * t[0] + e[1] * t[1] + e[2] * t[2]
                    }, Ke.cross = function (e, t, r) {
                      var i = t[0],
                        n = t[1],
                        a = t[2],
                        o = r[0],
                        s = r[1],
                        l = r[2];
                      return e[0] = n * l - a * s, e[1] = a * o - i * l, e[2] = i * s - n * o, e
                    }, Ke.lerp = function (e, t, r, i) {
                      var n = t[0],
                        a = t[1],
                        o = t[2];
                      return e[0] = n + i * (r[0] - n), e[1] = a + i * (r[1] - a), e[2] = o + i * (r[2] - o), e
                    }, Ke.random = function (e, t) {
                      t = t || 1;
                      var r = 2 * de() * Math.PI,
                        i = 2 * de() - 1,
                        n = Math.sqrt(1 - i * i) * t;
                      return e[0] = Math.cos(r) * n, e[1] = Math.sin(r) * n, e[2] = i * t, e
                    }, Ke.transformMat4 = function (e, t, r) {
                      var i = t[0],
                        n = t[1],
                        a = t[2],
                        o = r[3] * i + r[7] * n + r[11] * a + r[15];
                      return o = o || 1, e[0] = (r[0] * i + r[4] * n + r[8] * a + r[12]) / o, e[1] = (r[1] * i + r[5] * n + r[9] * a + r[13]) / o, e[2] = (r[2] * i + r[6] * n + r[10] * a + r[14]) / o, e
                    }, Ke.transformMat3 = function (e, t, r) {
                      var i = t[0],
                        n = t[1],
                        a = t[2];
                      return e[0] = i * r[0] + n * r[3] + a * r[6], e[1] = i * r[1] + n * r[4] + a * r[7], e[2] = i * r[2] + n * r[5] + a * r[8], e
                    }, Ke.transformQuat = function (e, t, r) {
                      var i = t[0],
                        n = t[1],
                        a = t[2],
                        o = r[0],
                        s = r[1],
                        l = r[2],
                        h = r[3],
                        u = h * i + s * a - l * n,
                        c = h * n + l * i - o * a,
                        d = h * a + o * n - s * i,
                        f = -o * i - s * n - l * a;
                      return e[0] = u * h + f * -o + c * -l - d * -s, e[1] = c * h + f * -s + d * -o - u * -l, e[2] = d * h + f * -l + u * -s - c * -o, e
                    }, Ke.rotateX = function (e, t, r, i) {
                      var n = [],
                        a = [];
                      return n[0] = t[0] - r[0], n[1] = t[1] - r[1], n[2] = t[2] - r[2], a[0] = n[0], a[1] = n[1] * Math.cos(i) - n[2] * Math.sin(i), a[2] = n[1] * Math.sin(i) + n[2] * Math.cos(i), e[0] = a[0] + r[0], e[1] = a[1] + r[1], e[2] = a[2] + r[2], e
                    }, Ke.rotateY = function (e, t, r, i) {
                      var n = [],
                        a = [];
                      return n[0] = t[0] - r[0], n[1] = t[1] - r[1], n[2] = t[2] - r[2], a[0] = n[2] * Math.sin(i) + n[0] * Math.cos(i), a[1] = n[1], a[2] = n[2] * Math.cos(i) - n[0] * Math.sin(i), e[0] = a[0] + r[0], e[1] = a[1] + r[1], e[2] = a[2] + r[2], e
                    }, Ke.rotateZ = function (e, t, r, i) {
                      var n = [],
                        a = [];
                      return n[0] = t[0] - r[0], n[1] = t[1] - r[1], n[2] = t[2] - r[2], a[0] = n[0] * Math.cos(i) - n[1] * Math.sin(i), a[1] = n[0] * Math.sin(i) + n[1] * Math.cos(i), a[2] = n[2], e[0] = a[0] + r[0], e[1] = a[1] + r[1], e[2] = a[2] + r[2], e
                    }, Ke.forEach = function () {
                      var e = Ke.create();
                      return function (t, r, i, n, a, o) {
                        var s, l;
                        for (r || (r = 3), i || (i = 0), l = n ? Math.min(n * r + i, t.length) : t.length, s = i; s < l; s += r) e[0] = t[s], e[1] = t[s + 1], e[2] = t[s + 2], a(e, e, o), t[s] = e[0], t[s + 1] = e[1], t[s + 2] = e[2];
                        return t
                      }
                    }(), Ke.angle = function (e, t) {
                      var r = Ke.fromValues(e[0], e[1], e[2]),
                        i = Ke.fromValues(t[0], t[1], t[2]);
                      Ke.normalize(r, r), Ke.normalize(i, i);
                      var n = Ke.dot(r, i);
                      return n > 1 ? 0 : Math.acos(n)
                    };
                    const Qe = Ke;
                    Xe.import(qe);
                    var Je = Ye.create,
                      $e = {};

                    function et(e) {
                      return e.material
                    }

                    function tt(e, t, r) {
                      return t.uniforms[r].value
                    }

                    function rt(e, t, r, i) {
                      return r !== i
                    }

                    function it(e) {
                      return !0
                    }

                    function nt() {}
                    var at = {
                      float: S,
                      byte: 5120,
                      ubyte: T,
                      short: 5122,
                      ushort: 5123
                    };

                    function ot(e, t, r) {
                      this.availableAttributes = e, this.availableAttributeSymbols = t, this.indicesBuffer = r, this.vao = null
                    }

                    function st(e) {
                      var t, r;
                      this.bind = function (e) {
                        t || ((t = U.createCanvas()).width = t.height = 1, t.getContext("2d"));
                        var i = e.gl,
                          n = !r;
                        n && (r = i.createTexture()), i.bindTexture(i.TEXTURE_2D, r), n && i.texImage2D(i.TEXTURE_2D, 0, i.RGBA, i.RGBA, i.UNSIGNED_BYTE, t)
                      }, this.unbind = function (e) {
                        e.gl.bindTexture(e.gl.TEXTURE_2D, null)
                      }, this.isRenderable = function () {
                        return !0
                      }
                    }
                    var lt = m.extend((function () {
                      return {
                        canvas: null,
                        _width: 100,
                        _height: 100,
                        devicePixelRatio: "undefined" != typeof window && window.devicePixelRatio || 1,
                        clearColor: [0, 0, 0, 0],
                        clearBit: 17664,
                        alpha: !0,
                        depth: !0,
                        stencil: !1,
                        antialias: !0,
                        premultipliedAlpha: !0,
                        preserveDrawingBuffer: !1,
                        throwError: !0,
                        gl: null,
                        viewport: {},
                        maxJointNumber: 20,
                        __currentFrameBuffer: null,
                        _viewportStack: [],
                        _clearStack: [],
                        _sceneRendering: null
                      }
                    }), (function () {
                      this.canvas || (this.canvas = U.createCanvas());
                      var e = this.canvas;
                      try {
                        var t = {
                          alpha: this.alpha,
                          depth: this.depth,
                          stencil: this.stencil,
                          antialias: this.antialias,
                          premultipliedAlpha: this.premultipliedAlpha,
                          preserveDrawingBuffer: this.preserveDrawingBuffer
                        };
                        if (this.gl = e.getContext("webgl", t) || e.getContext("experimental-webgl", t), !this.gl) throw new Error;
                        this._glinfo = new v(this.gl), this.gl.targetRenderer && console.error("Already created a renderer"), this.gl.targetRenderer = this, this.resize()
                      } catch (e) {
                        throw "Error creating WebGL Context " + e
                      }
                      this._programMgr = new Ee(this), this._placeholderTexture = new st(this)
                    }), {
                      resize: function (e, t) {
                        var r = this.canvas,
                          i = this.devicePixelRatio;
                        null != e ? (r.style && (r.style.width = e + "px", r.style.height = t + "px"), r.width = e * i, r.height = t * i, this._width = e, this._height = t) : (this._width = r.width / i, this._height = r.height / i), this.setViewport(0, 0, this._width, this._height)
                      },
                      getWidth: function () {
                        return this._width
                      },
                      getHeight: function () {
                        return this._height
                      },
                      getViewportAspect: function () {
                        var e = this.viewport;
                        return e.width / e.height
                      },
                      setDevicePixelRatio: function (e) {
                        this.devicePixelRatio = e, this.resize(this._width, this._height)
                      },
                      getDevicePixelRatio: function () {
                        return this.devicePixelRatio
                      },
                      getGLExtension: function (e) {
                        return this._glinfo.getExtension(e)
                      },
                      getGLParameter: function (e) {
                        return this._glinfo.getParameter(e)
                      },
                      setViewport: function (e, t, r, i, n) {
                        if ("object" == typeof e) {
                          var a = e;
                          e = a.x, t = a.y, r = a.width, i = a.height, n = a.devicePixelRatio
                        }
                        n = n || this.devicePixelRatio, this.gl.viewport(e * n, t * n, r * n, i * n), this.viewport = {
                          x: e,
                          y: t,
                          width: r,
                          height: i,
                          devicePixelRatio: n
                        }
                      },
                      saveViewport: function () {
                        this._viewportStack.push(this.viewport)
                      },
                      restoreViewport: function () {
                        this._viewportStack.length > 0 && this.setViewport(this._viewportStack.pop())
                      },
                      saveClear: function () {
                        this._clearStack.push({
                          clearBit: this.clearBit,
                          clearColor: this.clearColor
                        })
                      },
                      restoreClear: function () {
                        if (this._clearStack.length > 0) {
                          var e = this._clearStack.pop();
                          this.clearColor = e.clearColor, this.clearBit = e.clearBit
                        }
                      },
                      bindSceneRendering: function (e) {
                        this._sceneRendering = e
                      },
                      render: function (e, t, r, i) {
                        var n = this.gl,
                          a = this.clearColor;
                        if (this.clearBit) {
                          n.colorMask(!0, !0, !0, !0), n.depthMask(!0);
                          var o = this.viewport,
                            s = !1,
                            l = o.devicePixelRatio;
                          (o.width !== this._width || o.height !== this._height || l && l !== this.devicePixelRatio || o.x || o.y) && (s = !0, n.enable(n.SCISSOR_TEST), n.scissor(o.x * l, o.y * l, o.width * l, o.height * l)), n.clearColor(a[0], a[1], a[2], a[3]), n.clear(this.clearBit), s && n.disable(n.SCISSOR_TEST)
                        }
                        if (r || e.update(!1), e.updateLights(), t = t || e.getMainCamera()) {
                          t.update();
                          var h = e.updateRenderList(t, !0);
                          this._sceneRendering = e;
                          var u = h.opaque,
                            c = h.transparent,
                            d = e.material;
                          e.trigger("beforerender", this, e, t, h), i ? (this.renderPreZ(u, e, t), n.depthFunc(n.LEQUAL)) : n.depthFunc(n.LESS);
                          for (var f = Je(), p = Qe.create(), m = 0; m < c.length; m++) {
                            var g = c[m];
                            Ye.multiplyAffine(f, t.viewMatrix.array, g.worldTransform.array), Qe.transformMat4(p, g.position.array, f), g.__depth = p[2]
                          }
                          this.renderPass(u, t, {
                            getMaterial: function (e) {
                              return d || e.material
                            },
                            sortCompare: this.opaqueSortCompare
                          }), this.renderPass(c, t, {
                            getMaterial: function (e) {
                              return d || e.material
                            },
                            sortCompare: this.transparentSortCompare
                          }), e.trigger("afterrender", this, e, t, h), this._sceneRendering = null
                        } else console.error("Can't find camera in the scene.")
                      },
                      getProgram: function (e, t, r) {
                        return t = t || e.material, this._programMgr.getProgram(e, t, r)
                      },
                      validateProgram: function (e) {
                        if (e.__error) {
                          var t = e.__error;
                          if ($e[e.__uid__]) return;
                          if ($e[e.__uid__] = !0, this.throwError) throw new Error(t);
                          this.trigger("error", t)
                        }
                      },
                      updatePrograms: function (e, t, r) {
                        var i = r && r.getMaterial || et;
                        t = t || null;
                        for (var n = 0; n < e.length; n++) {
                          var a = e[n],
                            o = i.call(this, a);
                          if (n > 0) {
                            var s = e[n - 1],
                              l = s.joints ? s.joints.length : 0;
                            if ((a.joints ? a.joints.length : 0) === l && a.material === s.material && a.lightGroup === s.lightGroup) {
                              a.__program = s.__program;
                              continue
                            }
                          }
                          var h = this._programMgr.getProgram(a, o, t);
                          this.validateProgram(h), a.__program = h
                        }
                      },
                      renderPass: function (e, t, r) {
                        this.trigger("beforerenderpass", this, e, t, r), (r = r || {}).getMaterial = r.getMaterial || et, r.getUniform = r.getUniform || tt, r.isMaterialChanged = r.isMaterialChanged || rt, r.beforeRender = r.beforeRender || nt, r.afterRender = r.afterRender || nt;
                        var i = r.ifRender || it;
                        this.updatePrograms(e, this._sceneRendering, r), r.sortCompare && e.sort(r.sortCompare);
                        var n = this.viewport,
                          a = n.devicePixelRatio,
                          o = [n.x * a, n.y * a, n.width * a, n.height * a],
                          s = this.devicePixelRatio,
                          l = this.__currentFrameBuffer ? [this.__currentFrameBuffer.getTextureWidth(), this.__currentFrameBuffer.getTextureHeight()] : [this._width * s, this._height * s],
                          h = [o[2], o[3]],
                          u = Date.now();
                        t ? (Ye.copy(ht.VIEW, t.viewMatrix.array), Ye.copy(ht.PROJECTION, t.projectionMatrix.array), Ye.copy(ht.VIEWINVERSE, t.worldTransform.array)) : (Ye.identity(ht.VIEW), Ye.identity(ht.PROJECTION), Ye.identity(ht.VIEWINVERSE)), Ye.multiply(ht.VIEWPROJECTION, ht.PROJECTION, ht.VIEW), Ye.invert(ht.PROJECTIONINVERSE, ht.PROJECTION), Ye.invert(ht.VIEWPROJECTIONINVERSE, ht.VIEWPROJECTION);
                        for (var c, d, f, p, m, g, _, v, y, x, b, w, T = this.gl, S = this._sceneRendering, M = 0; M < e.length; M++) {
                          var A, E = e[M],
                            C = null != E.worldTransform;
                          if (i(E)) {
                            C && (A = E.isSkinnedMesh && E.isSkinnedMesh() ? E.offsetMatrix ? E.offsetMatrix.array : ht.IDENTITY : E.worldTransform.array);
                            var D = E.geometry,
                              L = r.getMaterial.call(this, E),
                              P = E.__program,
                              O = L.shader,
                              N = D.__uid__ + "-" + P.__uid__,
                              I = N !== x;
                            x = N, C && (Ye.copy(ht.WORLD, A), Ye.multiply(ht.WORLDVIEWPROJECTION, ht.VIEWPROJECTION, A), Ye.multiplyAffine(ht.WORLDVIEW, ht.VIEW, A), (O.matrixSemantics.WORLDINVERSE || O.matrixSemantics.WORLDINVERSETRANSPOSE) && Ye.invert(ht.WORLDINVERSE, A), (O.matrixSemantics.WORLDVIEWINVERSE || O.matrixSemantics.WORLDVIEWINVERSETRANSPOSE) && Ye.invert(ht.WORLDVIEWINVERSE, ht.WORLDVIEW), (O.matrixSemantics.WORLDVIEWPROJECTIONINVERSE || O.matrixSemantics.WORLDVIEWPROJECTIONINVERSETRANSPOSE) && Ye.invert(ht.WORLDVIEWPROJECTIONINVERSE, ht.WORLDVIEWPROJECTION)), E.beforeRender && E.beforeRender(this), r.beforeRender.call(this, E, L, c);
                            var R = P !== d;
                            R ? (P.bind(this), P.setUniformOfSemantic(T, "VIEWPORT", o), P.setUniformOfSemantic(T, "WINDOW_SIZE", l), t && (P.setUniformOfSemantic(T, "NEAR", t.near), P.setUniformOfSemantic(T, "FAR", t.far)), P.setUniformOfSemantic(T, "DEVICEPIXELRATIO", a), P.setUniformOfSemantic(T, "TIME", u), P.setUniformOfSemantic(T, "VIEWPORT_SIZE", h), S && S.setLightUniforms(P, E.lightGroup, this)) : P = d, (R || r.isMaterialChanged(E, f, L, c)) && (L.depthTest !== p && (L.depthTest ? T.enable(T.DEPTH_TEST) : T.disable(T.DEPTH_TEST), p = L.depthTest), L.depthMask !== m && (T.depthMask(L.depthMask), m = L.depthMask), L.transparent !== y && (L.transparent ? T.enable(T.BLEND) : T.disable(T.BLEND), y = L.transparent), L.transparent && (L.blend ? L.blend(T) : (T.blendEquationSeparate(T.FUNC_ADD, T.FUNC_ADD), T.blendFuncSeparate(T.SRC_ALPHA, T.ONE_MINUS_SRC_ALPHA, T.ONE, T.ONE_MINUS_SRC_ALPHA))), w = this._bindMaterial(E, L, P, f || null, c || null, d || null, r.getUniform), c = L);
                            var B = O.matrixSemanticKeys;
                            if (C)
                              for (var F = 0; F < B.length; F++) {
                                var z = B[F],
                                  G = O.matrixSemantics[z],
                                  U = ht[z];
                                if (G.isTranspose) {
                                  var k = ht[G.semanticNoTranspose];
                                  Ye.transpose(U, k)
                                }
                                P.setUniform(T, G.type, G.symbol, U)
                              }
                            E.cullFace !== _ && (_ = E.cullFace, T.cullFace(_)), E.frontFace !== v && (v = E.frontFace, T.frontFace(v)), E.culling !== g && ((g = E.culling) ? T.enable(T.CULL_FACE) : T.disable(T.CULL_FACE)), this._updateSkeleton(E, P, w), I && (b = this._bindVAO(null, O, D, P)), this._renderObject(E, b, P), r.afterRender(this, E), E.afterRender && E.afterRender(this), d = P, f = E
                          }
                        }
                        this.trigger("afterrenderpass", this, e, t, r)
                      },
                      getMaxJointNumber: function () {
                        return this.maxJointNumber
                      },
                      _updateSkeleton: function (e, t, r) {
                        var i = this.gl,
                          n = e.skeleton;
                        if (n)
                          if (n.update(), e.joints.length > this.getMaxJointNumber()) {
                            var a = n.getSubSkinMatricesTexture(e.__uid__, e.joints);
                            t.useTextureSlot(this, a, r), t.setUniform(i, "1i", "skinMatricesTexture", r), t.setUniform(i, "1f", "skinMatricesTextureSize", a.width)
                          } else {
                            var o = n.getSubSkinMatrices(e.__uid__, e.joints);
                            t.setUniformOfSemantic(i, "SKIN_MATRIX", o)
                          }
                      },
                      _renderObject: function (e, t, r) {
                        var i = this.gl,
                          n = e.geometry,
                          a = e.mode;
                        null == a && (a = 4);
                        var o = null,
                          s = e.isInstancedMesh && e.isInstancedMesh();
                        if (!s || (o = this.getGLExtension("ANGLE_instanced_arrays"))) {
                          var l;
                          if (s && (l = this._bindInstancedAttributes(e, r, o)), t.indicesBuffer) {
                            var h = this.getGLExtension("OES_element_index_uint") && n.indices instanceof Uint32Array ? i.UNSIGNED_INT : i.UNSIGNED_SHORT;
                            s ? o.drawElementsInstancedANGLE(a, t.indicesBuffer.count, h, 0, e.getInstanceCount()) : i.drawElements(a, t.indicesBuffer.count, h, 0)
                          } else s ? o.drawArraysInstancedANGLE(a, 0, n.vertexCount, e.getInstanceCount()) : i.drawArrays(a, 0, n.vertexCount);
                          if (s)
                            for (var u = 0; u < l.length; u++) i.disableVertexAttribArray(l[u])
                        } else console.warn("Device not support ANGLE_instanced_arrays extension")
                      },
                      _bindInstancedAttributes: function (e, t, r) {
                        for (var i = this.gl, n = e.getInstancedAttributesBuffers(this), a = [], o = 0; o < n.length; o++) {
                          var s = n[o],
                            l = t.getAttribLocation(i, s.symbol);
                          if (!(l < 0)) {
                            var h = at[s.type] || i.FLOAT;
                            i.enableVertexAttribArray(l), i.bindBuffer(i.ARRAY_BUFFER, s.buffer), i.vertexAttribPointer(l, s.size, h, !1, 0, 0), r.vertexAttribDivisorANGLE(l, s.divisor), a.push(l)
                          }
                        }
                        return a
                      },
                      _bindMaterial: function (e, t, r, i, n, a, o) {
                        for (var s = this.gl, l = a === r, h = r.currentTextureSlot(), u = t.getEnabledUniforms(), c = t.getTextureUniforms(), d = this._placeholderTexture, f = 0; f < c.length; f++) {
                          var p = o(e, t, _ = c[f]);
                          if ("t" === (g = t.uniforms[_].type) && p) p.__slot = -1;
                          else if ("tv" === g)
                            for (var m = 0; m < p.length; m++) p[m] && (p[m].__slot = -1)
                        }
                        for (d.__slot = -1, f = 0; f < u.length; f++) {
                          var g, _ = u[f],
                            v = t.uniforms[_],
                            y = (p = o(e, t, _), "t" === (g = v.type));
                          if (y && (p && p.isRenderable() || (p = d)), n && l) {
                            var x = o(i, n, _);
                            if (y && (x && x.isRenderable() || (x = d)), x === p) {
                              if (y) r.takeCurrentTextureSlot(this, null);
                              else if ("tv" === g && p)
                                for (m = 0; m < p.length; m++) r.takeCurrentTextureSlot(this, null);
                              continue
                            }
                          }
                          if (null != p)
                            if (y)
                              if (p.__slot < 0) {
                                var b = r.currentTextureSlot();
                                r.setUniform(s, "1i", _, b) && (r.takeCurrentTextureSlot(this, p), p.__slot = b)
                              } else r.setUniform(s, "1i", _, p.__slot);
                          else if (Array.isArray(p)) {
                            if (0 === p.length) continue;
                            if ("tv" === g) {
                              if (!r.hasUniform(_)) continue;
                              var w = [];
                              for (m = 0; m < p.length; m++) {
                                var T = p[m];
                                T.__slot < 0 ? (b = r.currentTextureSlot(), w.push(b), r.takeCurrentTextureSlot(this, T), T.__slot = b) : w.push(T.__slot)
                              }
                              r.setUniform(s, "1iv", _, w)
                            } else r.setUniform(s, v.type, _, p)
                          } else r.setUniform(s, v.type, _, p)
                        }
                        var S = r.currentTextureSlot();
                        return r.resetTextureSlot(h), S
                      },
                      _bindVAO: function (e, t, r, i) {
                        var n = !r.dynamic,
                          a = this.gl,
                          o = this.__uid__ + "-" + i.__uid__,
                          s = r.__vaoCache[o];
                        if (!s) {
                          var l = r.getBufferChunks(this);
                          if (!l || !l.length) return;
                          for (var h = l[0], u = h.attributeBuffers, c = h.indicesBuffer, d = [], f = [], p = 0; p < u.length; p++) {
                            var m, g = (w = u[p]).name,
                              _ = w.semantic;
                            if (_) {
                              var v = t.attributeSemantics[_];
                              m = v && v.symbol
                            } else m = g;
                            m && i.attributes[m] && (d.push(w), f.push(m))
                          }
                          s = new ot(d, f, c), n && (r.__vaoCache[o] = s)
                        }
                        var y = !0;
                        if (e && n && (null == s.vao ? s.vao = e.createVertexArrayOES() : y = !1, e.bindVertexArrayOES(s.vao)), d = s.availableAttributes, c = s.indicesBuffer, y) {
                          var x = i.enableAttributes(this, s.availableAttributeSymbols, e && n && s);
                          for (p = 0; p < d.length; p++) {
                            var b = x[p];
                            if (-1 !== b) {
                              var w, T = (w = d[p]).buffer,
                                S = w.size,
                                M = at[w.type] || a.FLOAT;
                              a.bindBuffer(a.ARRAY_BUFFER, T), a.vertexAttribPointer(b, S, M, !1, 0, 0)
                            }
                          }
                          r.isUseIndices() && a.bindBuffer(a.ELEMENT_ARRAY_BUFFER, c.buffer)
                        }
                        return s
                      },
                      renderPreZ: function (e, t, r) {
                        var i = this.gl,
                          n = this._prezMaterial || new le({
                            shader: new Xe(Xe.source("clay.prez.vertex"), Xe.source("clay.prez.fragment"))
                          });
                        this._prezMaterial = n, i.colorMask(!1, !1, !1, !1), i.depthMask(!0), this.renderPass(e, r, {
                          ifRender: function (e) {
                            return !e.ignorePreZ
                          },
                          isMaterialChanged: function (e, t) {
                            var r = e.material,
                              i = t.material;
                            return r.get("diffuseMap") !== i.get("diffuseMap") || (r.get("alphaCutoff") || 0) !== (i.get("alphaCutoff") || 0)
                          },
                          getUniform: function (e, t, r) {
                            return "alphaMap" === r ? e.material.get("diffuseMap") : "alphaCutoff" === r ? e.material.isDefined("fragment", "ALPHA_TEST") && e.material.get("diffuseMap") && e.material.get("alphaCutoff") || 0 : "uvRepeat" === r ? e.material.get("uvRepeat") : "uvOffset" === r ? e.material.get("uvOffset") : t.get(r)
                          },
                          getMaterial: function () {
                            return n
                          },
                          sort: this.opaqueSortCompare
                        }), i.colorMask(!0, !0, !0, !0), i.depthMask(!0)
                      },
                      disposeScene: function (e) {
                        this.disposeNode(e, !0, !0), e.dispose()
                      },
                      disposeNode: function (e, t, r) {
                        e.getParent() && e.getParent().remove(e);
                        var i = {};
                        e.traverse((function (e) {
                          var n = e.material;
                          if (e.geometry && t && e.geometry.dispose(this), r && n && !i[n.__uid__]) {
                            for (var a = n.getTextureUniforms(), o = 0; o < a.length; o++) {
                              var s = a[o],
                                l = n.uniforms[s].value,
                                h = n.uniforms[s].type;
                              if (l)
                                if ("t" === h) l.dispose && l.dispose(this);
                                else if ("tv" === h)
                                for (var u = 0; u < l.length; u++) l[u] && l[u].dispose && l[u].dispose(this)
                            }
                            i[n.__uid__] = !0
                          }
                          e.dispose && e.dispose(this)
                        }), this)
                      },
                      disposeGeometry: function (e) {
                        e.dispose(this)
                      },
                      disposeTexture: function (e) {
                        e.dispose(this)
                      },
                      disposeFrameBuffer: function (e) {
                        e.dispose(this)
                      },
                      dispose: function () {},
                      screenToNDC: function (e, t, r) {
                        r || (r = new _e), t = this._height - t;
                        var i = this.viewport,
                          n = r.array;
                        return n[0] = (e - i.x) / i.width, n[0] = 2 * n[0] - 1, n[1] = (t - i.y) / i.height, n[1] = 2 * n[1] - 1, r
                      }
                    });
                    lt.opaqueSortCompare = lt.prototype.opaqueSortCompare = function (e, t) {
                      return e.renderOrder === t.renderOrder ? e.__program === t.__program ? e.material === t.material ? e.geometry.__uid__ - t.geometry.__uid__ : e.material.__uid__ - t.material.__uid__ : e.__program && t.__program ? e.__program.__uid__ - t.__program.__uid__ : 0 : e.renderOrder - t.renderOrder
                    }, lt.transparentSortCompare = lt.prototype.transparentSortCompare = function (e, t) {
                      return e.renderOrder === t.renderOrder ? e.__depth === t.__depth ? e.__program === t.__program ? e.material === t.material ? e.geometry.__uid__ - t.geometry.__uid__ : e.material.__uid__ - t.material.__uid__ : e.__program && t.__program ? e.__program.__uid__ - t.__program.__uid__ : 0 : e.__depth - t.__depth : e.renderOrder - t.renderOrder
                    };
                    var ht = {
                      IDENTITY: Je(),
                      WORLD: Je(),
                      VIEW: Je(),
                      PROJECTION: Je(),
                      WORLDVIEW: Je(),
                      VIEWPROJECTION: Je(),
                      WORLDVIEWPROJECTION: Je(),
                      WORLDINVERSE: Je(),
                      VIEWINVERSE: Je(),
                      PROJECTIONINVERSE: Je(),
                      WORLDVIEWINVERSE: Je(),
                      VIEWPROJECTIONINVERSE: Je(),
                      WORLDVIEWPROJECTIONINVERSE: Je(),
                      WORLDTRANSPOSE: Je(),
                      VIEWTRANSPOSE: Je(),
                      PROJECTIONTRANSPOSE: Je(),
                      WORLDVIEWTRANSPOSE: Je(),
                      VIEWPROJECTIONTRANSPOSE: Je(),
                      WORLDVIEWPROJECTIONTRANSPOSE: Je(),
                      WORLDINVERSETRANSPOSE: Je(),
                      VIEWINVERSETRANSPOSE: Je(),
                      PROJECTIONINVERSETRANSPOSE: Je(),
                      WORLDVIEWINVERSETRANSPOSE: Je(),
                      VIEWPROJECTIONINVERSETRANSPOSE: Je(),
                      WORLDVIEWPROJECTIONINVERSETRANSPOSE: Je()
                    };
                    lt.COLOR_BUFFER_BIT = 16384, lt.DEPTH_BUFFER_BIT = 256, lt.STENCIL_BUFFER_BIT = 1024;
                    const ut = lt;
                    var ct = function (e, t, r) {
                      e = e || 0, t = t || 0, r = r || 0, this.array = Qe.fromValues(e, t, r), this._dirty = !0
                    };
                    ct.prototype = {
                      constructor: ct,
                      add: function (e) {
                        return Qe.add(this.array, this.array, e.array), this._dirty = !0, this
                      },
                      set: function (e, t, r) {
                        return this.array[0] = e, this.array[1] = t, this.array[2] = r, this._dirty = !0, this
                      },
                      setArray: function (e) {
                        return this.array[0] = e[0], this.array[1] = e[1], this.array[2] = e[2], this._dirty = !0, this
                      },
                      clone: function () {
                        return new ct(this.x, this.y, this.z)
                      },
                      copy: function (e) {
                        return Qe.copy(this.array, e.array), this._dirty = !0, this
                      },
                      cross: function (e, t) {
                        return Qe.cross(this.array, e.array, t.array), this._dirty = !0, this
                      },
                      dist: function (e) {
                        return Qe.dist(this.array, e.array)
                      },
                      distance: function (e) {
                        return Qe.distance(this.array, e.array)
                      },
                      div: function (e) {
                        return Qe.div(this.array, this.array, e.array), this._dirty = !0, this
                      },
                      divide: function (e) {
                        return Qe.divide(this.array, this.array, e.array), this._dirty = !0, this
                      },
                      dot: function (e) {
                        return Qe.dot(this.array, e.array)
                      },
                      len: function () {
                        return Qe.len(this.array)
                      },
                      length: function () {
                        return Qe.length(this.array)
                      },
                      lerp: function (e, t, r) {
                        return Qe.lerp(this.array, e.array, t.array, r), this._dirty = !0, this
                      },
                      min: function (e) {
                        return Qe.min(this.array, this.array, e.array), this._dirty = !0, this
                      },
                      max: function (e) {
                        return Qe.max(this.array, this.array, e.array), this._dirty = !0, this
                      },
                      mul: function (e) {
                        return Qe.mul(this.array, this.array, e.array), this._dirty = !0, this
                      },
                      multiply: function (e) {
                        return Qe.multiply(this.array, this.array, e.array), this._dirty = !0, this
                      },
                      negate: function () {
                        return Qe.negate(this.array, this.array), this._dirty = !0, this
                      },
                      normalize: function () {
                        return Qe.normalize(this.array, this.array), this._dirty = !0, this
                      },
                      random: function (e) {
                        return Qe.random(this.array, e), this._dirty = !0, this
                      },
                      scale: function (e) {
                        return Qe.scale(this.array, this.array, e), this._dirty = !0, this
                      },
                      scaleAndAdd: function (e, t) {
                        return Qe.scaleAndAdd(this.array, this.array, e.array, t), this._dirty = !0, this
                      },
                      sqrDist: function (e) {
                        return Qe.sqrDist(this.array, e.array)
                      },
                      squaredDistance: function (e) {
                        return Qe.squaredDistance(this.array, e.array)
                      },
                      sqrLen: function () {
                        return Qe.sqrLen(this.array)
                      },
                      squaredLength: function () {
                        return Qe.squaredLength(this.array)
                      },
                      sub: function (e) {
                        return Qe.sub(this.array, this.array, e.array), this._dirty = !0, this
                      },
                      subtract: function (e) {
                        return Qe.subtract(this.array, this.array, e.array), this._dirty = !0, this
                      },
                      transformMat3: function (e) {
                        return Qe.transformMat3(this.array, this.array, e.array), this._dirty = !0, this
                      },
                      transformMat4: function (e) {
                        return Qe.transformMat4(this.array, this.array, e.array), this._dirty = !0, this
                      },
                      transformQuat: function (e) {
                        return Qe.transformQuat(this.array, this.array, e.array), this._dirty = !0, this
                      },
                      applyProjection: function (e) {
                        var t = this.array;
                        if (0 === (e = e.array)[15]) {
                          var r = -1 / t[2];
                          t[0] = e[0] * t[0] * r, t[1] = e[5] * t[1] * r, t[2] = (e[10] * t[2] + e[14]) * r
                        } else t[0] = e[0] * t[0] + e[12], t[1] = e[5] * t[1] + e[13], t[2] = e[10] * t[2] + e[14];
                        return this._dirty = !0, this
                      },
                      eulerFromQuat: function (e, t) {
                        ct.eulerFromQuat(this, e, t)
                      },
                      eulerFromMat3: function (e, t) {
                        ct.eulerFromMat3(this, e, t)
                      },
                      toString: function () {
                        return "[" + Array.prototype.join.call(this.array, ",") + "]"
                      },
                      toArray: function () {
                        return Array.prototype.slice.call(this.array)
                      }
                    };
                    var dt = Object.defineProperty;
                    if (dt) {
                      var ft = ct.prototype;
                      dt(ft, "x", {
                        get: function () {
                          return this.array[0]
                        },
                        set: function (e) {
                          this.array[0] = e, this._dirty = !0
                        }
                      }), dt(ft, "y", {
                        get: function () {
                          return this.array[1]
                        },
                        set: function (e) {
                          this.array[1] = e, this._dirty = !0
                        }
                      }), dt(ft, "z", {
                        get: function () {
                          return this.array[2]
                        },
                        set: function (e) {
                          this.array[2] = e, this._dirty = !0
                        }
                      })
                    }

                    function pt(e, t, r) {
                      return e < t ? t : e > r ? r : e
                    }
                    ct.add = function (e, t, r) {
                      return Qe.add(e.array, t.array, r.array), e._dirty = !0, e
                    }, ct.set = function (e, t, r, i) {
                      Qe.set(e.array, t, r, i), e._dirty = !0
                    }, ct.copy = function (e, t) {
                      return Qe.copy(e.array, t.array), e._dirty = !0, e
                    }, ct.cross = function (e, t, r) {
                      return Qe.cross(e.array, t.array, r.array), e._dirty = !0, e
                    }, ct.distance = ct.dist = function (e, t) {
                      return Qe.distance(e.array, t.array)
                    }, ct.divide = ct.div = function (e, t, r) {
                      return Qe.divide(e.array, t.array, r.array), e._dirty = !0, e
                    }, ct.dot = function (e, t) {
                      return Qe.dot(e.array, t.array)
                    }, ct.len = function (e) {
                      return Qe.length(e.array)
                    }, ct.lerp = function (e, t, r, i) {
                      return Qe.lerp(e.array, t.array, r.array, i), e._dirty = !0, e
                    }, ct.min = function (e, t, r) {
                      return Qe.min(e.array, t.array, r.array), e._dirty = !0, e
                    }, ct.max = function (e, t, r) {
                      return Qe.max(e.array, t.array, r.array), e._dirty = !0, e
                    }, ct.multiply = ct.mul = function (e, t, r) {
                      return Qe.multiply(e.array, t.array, r.array), e._dirty = !0, e
                    }, ct.negate = function (e, t) {
                      return Qe.negate(e.array, t.array), e._dirty = !0, e
                    }, ct.normalize = function (e, t) {
                      return Qe.normalize(e.array, t.array), e._dirty = !0, e
                    }, ct.random = function (e, t) {
                      return Qe.random(e.array, t), e._dirty = !0, e
                    }, ct.scale = function (e, t, r) {
                      return Qe.scale(e.array, t.array, r), e._dirty = !0, e
                    }, ct.scaleAndAdd = function (e, t, r, i) {
                      return Qe.scaleAndAdd(e.array, t.array, r.array, i), e._dirty = !0, e
                    }, ct.squaredDistance = ct.sqrDist = function (e, t) {
                      return Qe.sqrDist(e.array, t.array)
                    }, ct.squaredLength = ct.sqrLen = function (e) {
                      return Qe.sqrLen(e.array)
                    }, ct.subtract = ct.sub = function (e, t, r) {
                      return Qe.subtract(e.array, t.array, r.array), e._dirty = !0, e
                    }, ct.transformMat3 = function (e, t, r) {
                      return Qe.transformMat3(e.array, t.array, r.array), e._dirty = !0, e
                    }, ct.transformMat4 = function (e, t, r) {
                      return Qe.transformMat4(e.array, t.array, r.array), e._dirty = !0, e
                    }, ct.transformQuat = function (e, t, r) {
                      return Qe.transformQuat(e.array, t.array, r.array), e._dirty = !0, e
                    };
                    var mt = Math.atan2,
                      gt = Math.asin,
                      _t = Math.abs;
                    ct.eulerFromQuat = function (e, t, r) {
                      e._dirty = !0, t = t.array;
                      var i = e.array,
                        n = t[0],
                        a = t[1],
                        o = t[2],
                        s = t[3],
                        l = n * n,
                        h = a * a,
                        u = o * o,
                        c = s * s;
                      switch (r = (r || "XYZ").toUpperCase()) {
                        case "XYZ":
                          i[0] = mt(2 * (n * s - a * o), c - l - h + u), i[1] = gt(pt(2 * (n * o + a * s), -1, 1)), i[2] = mt(2 * (o * s - n * a), c + l - h - u);
                          break;
                        case "YXZ":
                          i[0] = gt(pt(2 * (n * s - a * o), -1, 1)), i[1] = mt(2 * (n * o + a * s), c - l - h + u), i[2] = mt(2 * (n * a + o * s), c - l + h - u);
                          break;
                        case "ZXY":
                          i[0] = gt(pt(2 * (n * s + a * o), -1, 1)), i[1] = mt(2 * (a * s - o * n), c - l - h + u), i[2] = mt(2 * (o * s - n * a), c - l + h - u);
                          break;
                        case "ZYX":
                          i[0] = mt(2 * (n * s + o * a), c - l - h + u), i[1] = gt(pt(2 * (a * s - n * o), -1, 1)), i[2] = mt(2 * (n * a + o * s), c + l - h - u);
                          break;
                        case "YZX":
                          i[0] = mt(2 * (n * s - o * a), c - l + h - u), i[1] = mt(2 * (a * s - n * o), c + l - h - u), i[2] = gt(pt(2 * (n * a + o * s), -1, 1));
                          break;
                        case "XZY":
                          i[0] = mt(2 * (n * s + a * o), c - l + h - u), i[1] = mt(2 * (n * o + a * s), c + l - h - u), i[2] = gt(pt(2 * (o * s - n * a), -1, 1));
                          break;
                        default:
                          console.warn("Unkown order: " + r)
                      }
                      return e
                    }, ct.eulerFromMat3 = function (e, t, r) {
                      var i = t.array,
                        n = i[0],
                        a = i[3],
                        o = i[6],
                        s = i[1],
                        l = i[4],
                        h = i[7],
                        u = i[2],
                        c = i[5],
                        d = i[8],
                        f = e.array;
                      switch (r = (r || "XYZ").toUpperCase()) {
                        case "XYZ":
                          f[1] = gt(pt(o, -1, 1)), _t(o) < .99999 ? (f[0] = mt(-h, d), f[2] = mt(-a, n)) : (f[0] = mt(c, l), f[2] = 0);
                          break;
                        case "YXZ":
                          f[0] = gt(-pt(h, -1, 1)), _t(h) < .99999 ? (f[1] = mt(o, d), f[2] = mt(s, l)) : (f[1] = mt(-u, n), f[2] = 0);
                          break;
                        case "ZXY":
                          f[0] = gt(pt(c, -1, 1)), _t(c) < .99999 ? (f[1] = mt(-u, d), f[2] = mt(-a, l)) : (f[1] = 0, f[2] = mt(s, n));
                          break;
                        case "ZYX":
                          f[1] = gt(-pt(u, -1, 1)), _t(u) < .99999 ? (f[0] = mt(c, d), f[2] = mt(s, n)) : (f[0] = 0, f[2] = mt(-a, l));
                          break;
                        case "YZX":
                          f[2] = gt(pt(s, -1, 1)), _t(s) < .99999 ? (f[0] = mt(-h, l), f[1] = mt(-u, n)) : (f[0] = 0, f[1] = mt(o, d));
                          break;
                        case "XZY":
                          f[2] = gt(-pt(a, -1, 1)), _t(a) < .99999 ? (f[0] = mt(c, l), f[1] = mt(o, n)) : (f[0] = mt(-h, d), f[1] = 0);
                          break;
                        default:
                          console.warn("Unkown order: " + r)
                      }
                      return e._dirty = !0, e
                    }, Object.defineProperties(ct, {
                      POSITIVE_X: {
                        get: function () {
                          return new ct(1, 0, 0)
                        }
                      },
                      NEGATIVE_X: {
                        get: function () {
                          return new ct(-1, 0, 0)
                        }
                      },
                      POSITIVE_Y: {
                        get: function () {
                          return new ct(0, 1, 0)
                        }
                      },
                      NEGATIVE_Y: {
                        get: function () {
                          return new ct(0, -1, 0)
                        }
                      },
                      POSITIVE_Z: {
                        get: function () {
                          return new ct(0, 0, 1)
                        }
                      },
                      NEGATIVE_Z: {
                        get: function () {
                          return new ct(0, 0, -1)
                        }
                      },
                      UP: {
                        get: function () {
                          return new ct(0, 1, 0)
                        }
                      },
                      ZERO: {
                        get: function () {
                          return new ct
                        }
                      }
                    });
                    const vt = ct;
                    var yt, xt, bt, wt, Tt, St = function (e, t) {
                      this.origin = e || new vt, this.direction = t || new vt
                    };
                    St.prototype = {
                      constructor: St,
                      intersectPlane: function (e, t) {
                        var r = e.normal.array,
                          i = e.distance,
                          n = this.origin.array,
                          a = this.direction.array,
                          o = Qe.dot(r, a);
                        if (0 === o) return null;
                        t || (t = new vt);
                        var s = (Qe.dot(r, n) - i) / o;
                        return Qe.scaleAndAdd(t.array, n, a, -s), t._dirty = !0, t
                      },
                      mirrorAgainstPlane: function (e) {
                        var t = Qe.dot(e.normal.array, this.direction.array);
                        Qe.scaleAndAdd(this.direction.array, this.direction.array, e.normal.array, 2 * -t), this.direction._dirty = !0
                      },
                      distanceToPoint: (Tt = Qe.create(), function (e) {
                        Qe.sub(Tt, e, this.origin.array);
                        var t = Qe.dot(Tt, this.direction.array);
                        if (t < 0) return Qe.distance(this.origin.array, e);
                        var r = Qe.lenSquared(Tt);
                        return Math.sqrt(r - t * t)
                      }),
                      intersectSphere: function () {
                        var e = Qe.create();
                        return function (t, r, i) {
                          var n = this.origin.array,
                            a = this.direction.array;
                          t = t.array, Qe.sub(e, t, n);
                          var o = Qe.dot(e, a),
                            s = Qe.squaredLength(e) - o * o,
                            l = r * r;
                          if (!(s > l)) {
                            var h = Math.sqrt(l - s),
                              u = o - h,
                              c = o + h;
                            return i || (i = new vt), u < 0 ? c < 0 ? null : (Qe.scaleAndAdd(i.array, n, a, c), i) : (Qe.scaleAndAdd(i.array, n, a, u), i)
                          }
                        }
                      }(),
                      intersectBoundingBox: function (e, t) {
                        var r, i, n, a, o, s, l = this.direction.array,
                          h = this.origin.array,
                          u = e.min.array,
                          c = e.max.array,
                          d = 1 / l[0],
                          f = 1 / l[1],
                          p = 1 / l[2];
                        if (d >= 0 ? (r = (u[0] - h[0]) * d, i = (c[0] - h[0]) * d) : (i = (u[0] - h[0]) * d, r = (c[0] - h[0]) * d), f >= 0 ? (n = (u[1] - h[1]) * f, a = (c[1] - h[1]) * f) : (a = (u[1] - h[1]) * f, n = (c[1] - h[1]) * f), r > a || n > i) return null;
                        if ((n > r || r != r) && (r = n), (a < i || i != i) && (i = a), p >= 0 ? (o = (u[2] - h[2]) * p, s = (c[2] - h[2]) * p) : (s = (u[2] - h[2]) * p, o = (c[2] - h[2]) * p), r > s || o > i) return null;
                        if ((o > r || r != r) && (r = o), (s < i || i != i) && (i = s), i < 0) return null;
                        var m = r >= 0 ? r : i;
                        return t || (t = new vt), Qe.scaleAndAdd(t.array, h, l, m), t
                      },
                      intersectTriangle: (yt = Qe.create(), xt = Qe.create(), bt = Qe.create(), wt = Qe.create(), function (e, t, r, i, n, a) {
                        var o = this.direction.array,
                          s = this.origin.array;
                        e = e.array, t = t.array, r = r.array, Qe.sub(yt, t, e), Qe.sub(xt, r, e), Qe.cross(wt, xt, o);
                        var l = Qe.dot(yt, wt);
                        if (i) {
                          if (l > -1e-5) return null
                        } else if (l > -1e-5 && l < 1e-5) return null;
                        Qe.sub(bt, s, e);
                        var h = Qe.dot(wt, bt) / l;
                        if (h < 0 || h > 1) return null;
                        Qe.cross(wt, yt, bt);
                        var u = Qe.dot(o, wt) / l;
                        if (u < 0 || u > 1 || h + u > 1) return null;
                        Qe.cross(wt, yt, xt);
                        var c = -Qe.dot(bt, wt) / l;
                        return c < 0 ? null : (n || (n = new vt), a && vt.set(a, 1 - h - u, h, u), Qe.scaleAndAdd(n.array, s, o, c), n)
                      }),
                      applyTransform: function (e) {
                        vt.add(this.direction, this.direction, this.origin), vt.transformMat4(this.origin, this.origin, e), vt.transformMat4(this.direction, this.direction, e), vt.sub(this.direction, this.direction, this.origin), vt.normalize(this.direction, this.direction)
                      },
                      copy: function (e) {
                        vt.copy(this.origin, e.origin), vt.copy(this.direction, e.direction)
                      },
                      clone: function () {
                        var e = new St;
                        return e.copy(this), e
                      }
                    };
                    const Mt = St;
                    var At = {
                      create: function () {
                        var e = new ce(4);
                        return e[0] = 0, e[1] = 0, e[2] = 0, e[3] = 0, e
                      },
                      clone: function (e) {
                        var t = new ce(4);
                        return t[0] = e[0], t[1] = e[1], t[2] = e[2], t[3] = e[3], t
                      },
                      fromValues: function (e, t, r, i) {
                        var n = new ce(4);
                        return n[0] = e, n[1] = t, n[2] = r, n[3] = i, n
                      },
                      copy: function (e, t) {
                        return e[0] = t[0], e[1] = t[1], e[2] = t[2], e[3] = t[3], e
                      },
                      set: function (e, t, r, i, n) {
                        return e[0] = t, e[1] = r, e[2] = i, e[3] = n, e
                      },
                      add: function (e, t, r) {
                        return e[0] = t[0] + r[0], e[1] = t[1] + r[1], e[2] = t[2] + r[2], e[3] = t[3] + r[3], e
                      },
                      subtract: function (e, t, r) {
                        return e[0] = t[0] - r[0], e[1] = t[1] - r[1], e[2] = t[2] - r[2], e[3] = t[3] - r[3], e
                      }
                    };
                    At.sub = At.subtract, At.multiply = function (e, t, r) {
                      return e[0] = t[0] * r[0], e[1] = t[1] * r[1], e[2] = t[2] * r[2], e[3] = t[3] * r[3], e
                    }, At.mul = At.multiply, At.divide = function (e, t, r) {
                      return e[0] = t[0] / r[0], e[1] = t[1] / r[1], e[2] = t[2] / r[2], e[3] = t[3] / r[3], e
                    }, At.div = At.divide, At.min = function (e, t, r) {
                      return e[0] = Math.min(t[0], r[0]), e[1] = Math.min(t[1], r[1]), e[2] = Math.min(t[2], r[2]), e[3] = Math.min(t[3], r[3]), e
                    }, At.max = function (e, t, r) {
                      return e[0] = Math.max(t[0], r[0]), e[1] = Math.max(t[1], r[1]), e[2] = Math.max(t[2], r[2]), e[3] = Math.max(t[3], r[3]), e
                    }, At.scale = function (e, t, r) {
                      return e[0] = t[0] * r, e[1] = t[1] * r, e[2] = t[2] * r, e[3] = t[3] * r, e
                    }, At.scaleAndAdd = function (e, t, r, i) {
                      return e[0] = t[0] + r[0] * i, e[1] = t[1] + r[1] * i, e[2] = t[2] + r[2] * i, e[3] = t[3] + r[3] * i, e
                    }, At.distance = function (e, t) {
                      var r = t[0] - e[0],
                        i = t[1] - e[1],
                        n = t[2] - e[2],
                        a = t[3] - e[3];
                      return Math.sqrt(r * r + i * i + n * n + a * a)
                    }, At.dist = At.distance, At.squaredDistance = function (e, t) {
                      var r = t[0] - e[0],
                        i = t[1] - e[1],
                        n = t[2] - e[2],
                        a = t[3] - e[3];
                      return r * r + i * i + n * n + a * a
                    }, At.sqrDist = At.squaredDistance, At.length = function (e) {
                      var t = e[0],
                        r = e[1],
                        i = e[2],
                        n = e[3];
                      return Math.sqrt(t * t + r * r + i * i + n * n)
                    }, At.len = At.length, At.squaredLength = function (e) {
                      var t = e[0],
                        r = e[1],
                        i = e[2],
                        n = e[3];
                      return t * t + r * r + i * i + n * n
                    }, At.sqrLen = At.squaredLength, At.negate = function (e, t) {
                      return e[0] = -t[0], e[1] = -t[1], e[2] = -t[2], e[3] = -t[3], e
                    }, At.inverse = function (e, t) {
                      return e[0] = 1 / t[0], e[1] = 1 / t[1], e[2] = 1 / t[2], e[3] = 1 / t[3], e
                    }, At.normalize = function (e, t) {
                      var r = t[0],
                        i = t[1],
                        n = t[2],
                        a = t[3],
                        o = r * r + i * i + n * n + a * a;
                      return o > 0 && (o = 1 / Math.sqrt(o), e[0] = t[0] * o, e[1] = t[1] * o, e[2] = t[2] * o, e[3] = t[3] * o), e
                    }, At.dot = function (e, t) {
                      return e[0] * t[0] + e[1] * t[1] + e[2] * t[2] + e[3] * t[3]
                    }, At.lerp = function (e, t, r, i) {
                      var n = t[0],
                        a = t[1],
                        o = t[2],
                        s = t[3];
                      return e[0] = n + i * (r[0] - n), e[1] = a + i * (r[1] - a), e[2] = o + i * (r[2] - o), e[3] = s + i * (r[3] - s), e
                    }, At.random = function (e, t) {
                      return t = t || 1, e[0] = de(), e[1] = de(), e[2] = de(), e[3] = de(), At.normalize(e, e), At.scale(e, e, t), e
                    }, At.transformMat4 = function (e, t, r) {
                      var i = t[0],
                        n = t[1],
                        a = t[2],
                        o = t[3];
                      return e[0] = r[0] * i + r[4] * n + r[8] * a + r[12] * o, e[1] = r[1] * i + r[5] * n + r[9] * a + r[13] * o, e[2] = r[2] * i + r[6] * n + r[10] * a + r[14] * o, e[3] = r[3] * i + r[7] * n + r[11] * a + r[15] * o, e
                    }, At.transformQuat = function (e, t, r) {
                      var i = t[0],
                        n = t[1],
                        a = t[2],
                        o = r[0],
                        s = r[1],
                        l = r[2],
                        h = r[3],
                        u = h * i + s * a - l * n,
                        c = h * n + l * i - o * a,
                        d = h * a + o * n - s * i,
                        f = -o * i - s * n - l * a;
                      return e[0] = u * h + f * -o + c * -l - d * -s, e[1] = c * h + f * -s + d * -o - u * -l, e[2] = d * h + f * -l + u * -s - c * -o, e
                    }, At.forEach = function () {
                      var e = At.create();
                      return function (t, r, i, n, a, o) {
                        var s, l;
                        for (r || (r = 4), i || (i = 0), l = n ? Math.min(n * r + i, t.length) : t.length, s = i; s < l; s += r) e[0] = t[s], e[1] = t[s + 1], e[2] = t[s + 2], e[3] = t[s + 3], a(e, e, o), t[s] = e[0], t[s + 1] = e[1], t[s + 2] = e[2], t[s + 3] = e[3];
                        return t
                      }
                    }();
                    const Et = At;
                    var Ct = {
                      create: function () {
                        var e = new ce(9);
                        return e[0] = 1, e[1] = 0, e[2] = 0, e[3] = 0, e[4] = 1, e[5] = 0, e[6] = 0, e[7] = 0, e[8] = 1, e
                      },
                      fromMat4: function (e, t) {
                        return e[0] = t[0], e[1] = t[1], e[2] = t[2], e[3] = t[4], e[4] = t[5], e[5] = t[6], e[6] = t[8], e[7] = t[9], e[8] = t[10], e
                      },
                      clone: function (e) {
                        var t = new ce(9);
                        return t[0] = e[0], t[1] = e[1], t[2] = e[2], t[3] = e[3], t[4] = e[4], t[5] = e[5], t[6] = e[6], t[7] = e[7], t[8] = e[8], t
                      },
                      copy: function (e, t) {
                        return e[0] = t[0], e[1] = t[1], e[2] = t[2], e[3] = t[3], e[4] = t[4], e[5] = t[5], e[6] = t[6], e[7] = t[7], e[8] = t[8], e
                      },
                      identity: function (e) {
                        return e[0] = 1, e[1] = 0, e[2] = 0, e[3] = 0, e[4] = 1, e[5] = 0, e[6] = 0, e[7] = 0, e[8] = 1, e
                      },
                      transpose: function (e, t) {
                        if (e === t) {
                          var r = t[1],
                            i = t[2],
                            n = t[5];
                          e[1] = t[3], e[2] = t[6], e[3] = r, e[5] = t[7], e[6] = i, e[7] = n
                        } else e[0] = t[0], e[1] = t[3], e[2] = t[6], e[3] = t[1], e[4] = t[4], e[5] = t[7], e[6] = t[2], e[7] = t[5], e[8] = t[8];
                        return e
                      },
                      invert: function (e, t) {
                        var r = t[0],
                          i = t[1],
                          n = t[2],
                          a = t[3],
                          o = t[4],
                          s = t[5],
                          l = t[6],
                          h = t[7],
                          u = t[8],
                          c = u * o - s * h,
                          d = -u * a + s * l,
                          f = h * a - o * l,
                          p = r * c + i * d + n * f;
                        return p ? (p = 1 / p, e[0] = c * p, e[1] = (-u * i + n * h) * p, e[2] = (s * i - n * o) * p, e[3] = d * p, e[4] = (u * r - n * l) * p, e[5] = (-s * r + n * a) * p, e[6] = f * p, e[7] = (-h * r + i * l) * p, e[8] = (o * r - i * a) * p, e) : null
                      },
                      adjoint: function (e, t) {
                        var r = t[0],
                          i = t[1],
                          n = t[2],
                          a = t[3],
                          o = t[4],
                          s = t[5],
                          l = t[6],
                          h = t[7],
                          u = t[8];
                        return e[0] = o * u - s * h, e[1] = n * h - i * u, e[2] = i * s - n * o, e[3] = s * l - a * u, e[4] = r * u - n * l, e[5] = n * a - r * s, e[6] = a * h - o * l, e[7] = i * l - r * h, e[8] = r * o - i * a, e
                      },
                      determinant: function (e) {
                        var t = e[0],
                          r = e[1],
                          i = e[2],
                          n = e[3],
                          a = e[4],
                          o = e[5],
                          s = e[6],
                          l = e[7],
                          h = e[8];
                        return t * (h * a - o * l) + r * (-h * n + o * s) + i * (l * n - a * s)
                      },
                      multiply: function (e, t, r) {
                        var i = t[0],
                          n = t[1],
                          a = t[2],
                          o = t[3],
                          s = t[4],
                          l = t[5],
                          h = t[6],
                          u = t[7],
                          c = t[8],
                          d = r[0],
                          f = r[1],
                          p = r[2],
                          m = r[3],
                          g = r[4],
                          _ = r[5],
                          v = r[6],
                          y = r[7],
                          x = r[8];
                        return e[0] = d * i + f * o + p * h, e[1] = d * n + f * s + p * u, e[2] = d * a + f * l + p * c, e[3] = m * i + g * o + _ * h, e[4] = m * n + g * s + _ * u, e[5] = m * a + g * l + _ * c, e[6] = v * i + y * o + x * h, e[7] = v * n + y * s + x * u, e[8] = v * a + y * l + x * c, e
                      }
                    };
                    Ct.mul = Ct.multiply, Ct.translate = function (e, t, r) {
                      var i = t[0],
                        n = t[1],
                        a = t[2],
                        o = t[3],
                        s = t[4],
                        l = t[5],
                        h = t[6],
                        u = t[7],
                        c = t[8],
                        d = r[0],
                        f = r[1];
                      return e[0] = i, e[1] = n, e[2] = a, e[3] = o, e[4] = s, e[5] = l, e[6] = d * i + f * o + h, e[7] = d * n + f * s + u, e[8] = d * a + f * l + c, e
                    }, Ct.rotate = function (e, t, r) {
                      var i = t[0],
                        n = t[1],
                        a = t[2],
                        o = t[3],
                        s = t[4],
                        l = t[5],
                        h = t[6],
                        u = t[7],
                        c = t[8],
                        d = Math.sin(r),
                        f = Math.cos(r);
                      return e[0] = f * i + d * o, e[1] = f * n + d * s, e[2] = f * a + d * l, e[3] = f * o - d * i, e[4] = f * s - d * n, e[5] = f * l - d * a, e[6] = h, e[7] = u, e[8] = c, e
                    }, Ct.scale = function (e, t, r) {
                      var i = r[0],
                        n = r[1];
                      return e[0] = i * t[0], e[1] = i * t[1], e[2] = i * t[2], e[3] = n * t[3], e[4] = n * t[4], e[5] = n * t[5], e[6] = t[6], e[7] = t[7], e[8] = t[8], e
                    }, Ct.fromMat2d = function (e, t) {
                      return e[0] = t[0], e[1] = t[1], e[2] = 0, e[3] = t[2], e[4] = t[3], e[5] = 0, e[6] = t[4], e[7] = t[5], e[8] = 1, e
                    }, Ct.fromQuat = function (e, t) {
                      var r = t[0],
                        i = t[1],
                        n = t[2],
                        a = t[3],
                        o = r + r,
                        s = i + i,
                        l = n + n,
                        h = r * o,
                        u = i * o,
                        c = i * s,
                        d = n * o,
                        f = n * s,
                        p = n * l,
                        m = a * o,
                        g = a * s,
                        _ = a * l;
                      return e[0] = 1 - c - p, e[3] = u - _, e[6] = d + g, e[1] = u + _, e[4] = 1 - h - p, e[7] = f - m, e[2] = d - g, e[5] = f + m, e[8] = 1 - h - c, e
                    }, Ct.normalFromMat4 = function (e, t) {
                      var r = t[0],
                        i = t[1],
                        n = t[2],
                        a = t[3],
                        o = t[4],
                        s = t[5],
                        l = t[6],
                        h = t[7],
                        u = t[8],
                        c = t[9],
                        d = t[10],
                        f = t[11],
                        p = t[12],
                        m = t[13],
                        g = t[14],
                        _ = t[15],
                        v = r * s - i * o,
                        y = r * l - n * o,
                        x = r * h - a * o,
                        b = i * l - n * s,
                        w = i * h - a * s,
                        T = n * h - a * l,
                        S = u * m - c * p,
                        M = u * g - d * p,
                        A = u * _ - f * p,
                        E = c * g - d * m,
                        C = c * _ - f * m,
                        D = d * _ - f * g,
                        L = v * D - y * C + x * E + b * A - w * M + T * S;
                      return L ? (L = 1 / L, e[0] = (s * D - l * C + h * E) * L, e[1] = (l * A - o * D - h * M) * L, e[2] = (o * C - s * A + h * S) * L, e[3] = (n * C - i * D - a * E) * L, e[4] = (r * D - n * A + a * M) * L, e[5] = (i * A - r * C - a * S) * L, e[6] = (m * T - g * w + _ * b) * L, e[7] = (g * x - p * T - _ * y) * L, e[8] = (p * w - m * x + _ * v) * L, e) : null
                    }, Ct.frob = function (e) {
                      return Math.sqrt(Math.pow(e[0], 2) + Math.pow(e[1], 2) + Math.pow(e[2], 2) + Math.pow(e[3], 2) + Math.pow(e[4], 2) + Math.pow(e[5], 2) + Math.pow(e[6], 2) + Math.pow(e[7], 2) + Math.pow(e[8], 2))
                    };
                    const Dt = Ct;
                    var Lt, Pt, Ot, Nt, It = {
                      create: function () {
                        var e = new ce(4);
                        return e[0] = 0, e[1] = 0, e[2] = 0, e[3] = 1, e
                      }
                    };
                    It.rotationTo = (Lt = Qe.create(), Pt = Qe.fromValues(1, 0, 0), Ot = Qe.fromValues(0, 1, 0), function (e, t, r) {
                      var i = Qe.dot(t, r);
                      return i < -.999999 ? (Qe.cross(Lt, Pt, t), Qe.length(Lt) < 1e-6 && Qe.cross(Lt, Ot, t), Qe.normalize(Lt, Lt), It.setAxisAngle(e, Lt, Math.PI), e) : i > .999999 ? (e[0] = 0, e[1] = 0, e[2] = 0, e[3] = 1, e) : (Qe.cross(Lt, t, r), e[0] = Lt[0], e[1] = Lt[1], e[2] = Lt[2], e[3] = 1 + i, It.normalize(e, e))
                    }), It.setAxes = (Nt = Dt.create(), function (e, t, r, i) {
                      return Nt[0] = r[0], Nt[3] = r[1], Nt[6] = r[2], Nt[1] = i[0], Nt[4] = i[1], Nt[7] = i[2], Nt[2] = -t[0], Nt[5] = -t[1], Nt[8] = -t[2], It.normalize(e, It.fromMat3(e, Nt))
                    }), It.clone = Et.clone, It.fromValues = Et.fromValues, It.copy = Et.copy, It.set = Et.set, It.identity = function (e) {
                      return e[0] = 0, e[1] = 0, e[2] = 0, e[3] = 1, e
                    }, It.setAxisAngle = function (e, t, r) {
                      r *= .5;
                      var i = Math.sin(r);
                      return e[0] = i * t[0], e[1] = i * t[1], e[2] = i * t[2], e[3] = Math.cos(r), e
                    }, It.add = Et.add, It.multiply = function (e, t, r) {
                      var i = t[0],
                        n = t[1],
                        a = t[2],
                        o = t[3],
                        s = r[0],
                        l = r[1],
                        h = r[2],
                        u = r[3];
                      return e[0] = i * u + o * s + n * h - a * l, e[1] = n * u + o * l + a * s - i * h, e[2] = a * u + o * h + i * l - n * s, e[3] = o * u - i * s - n * l - a * h, e
                    }, It.mul = It.multiply, It.scale = Et.scale, It.rotateX = function (e, t, r) {
                      r *= .5;
                      var i = t[0],
                        n = t[1],
                        a = t[2],
                        o = t[3],
                        s = Math.sin(r),
                        l = Math.cos(r);
                      return e[0] = i * l + o * s, e[1] = n * l + a * s, e[2] = a * l - n * s, e[3] = o * l - i * s, e
                    }, It.rotateY = function (e, t, r) {
                      r *= .5;
                      var i = t[0],
                        n = t[1],
                        a = t[2],
                        o = t[3],
                        s = Math.sin(r),
                        l = Math.cos(r);
                      return e[0] = i * l - a * s, e[1] = n * l + o * s, e[2] = a * l + i * s, e[3] = o * l - n * s, e
                    }, It.rotateZ = function (e, t, r) {
                      r *= .5;
                      var i = t[0],
                        n = t[1],
                        a = t[2],
                        o = t[3],
                        s = Math.sin(r),
                        l = Math.cos(r);
                      return e[0] = i * l + n * s, e[1] = n * l - i * s, e[2] = a * l + o * s, e[3] = o * l - a * s, e
                    }, It.calculateW = function (e, t) {
                      var r = t[0],
                        i = t[1],
                        n = t[2];
                      return e[0] = r, e[1] = i, e[2] = n, e[3] = Math.sqrt(Math.abs(1 - r * r - i * i - n * n)), e
                    }, It.dot = Et.dot, It.lerp = Et.lerp, It.slerp = function (e, t, r, i) {
                      var n, a, o, s, l, h = t[0],
                        u = t[1],
                        c = t[2],
                        d = t[3],
                        f = r[0],
                        p = r[1],
                        m = r[2],
                        g = r[3];
                      return (a = h * f + u * p + c * m + d * g) < 0 && (a = -a, f = -f, p = -p, m = -m, g = -g), 1 - a > 1e-6 ? (n = Math.acos(a), o = Math.sin(n), s = Math.sin((1 - i) * n) / o, l = Math.sin(i * n) / o) : (s = 1 - i, l = i), e[0] = s * h + l * f, e[1] = s * u + l * p, e[2] = s * c + l * m, e[3] = s * d + l * g, e
                    }, It.invert = function (e, t) {
                      var r = t[0],
                        i = t[1],
                        n = t[2],
                        a = t[3],
                        o = r * r + i * i + n * n + a * a,
                        s = o ? 1 / o : 0;
                      return e[0] = -r * s, e[1] = -i * s, e[2] = -n * s, e[3] = a * s, e
                    }, It.conjugate = function (e, t) {
                      return e[0] = -t[0], e[1] = -t[1], e[2] = -t[2], e[3] = t[3], e
                    }, It.length = Et.length, It.len = It.length, It.squaredLength = Et.squaredLength, It.sqrLen = It.squaredLength, It.normalize = Et.normalize, It.fromMat3 = function (e, t) {
                      var r, i = t[0] + t[4] + t[8];
                      if (i > 0) r = Math.sqrt(i + 1), e[3] = .5 * r, r = .5 / r, e[0] = (t[5] - t[7]) * r, e[1] = (t[6] - t[2]) * r, e[2] = (t[1] - t[3]) * r;
                      else {
                        var n = 0;
                        t[4] > t[0] && (n = 1), t[8] > t[3 * n + n] && (n = 2);
                        var a = (n + 1) % 3,
                          o = (n + 2) % 3;
                        r = Math.sqrt(t[3 * n + n] - t[3 * a + a] - t[3 * o + o] + 1), e[n] = .5 * r, r = .5 / r, e[3] = (t[3 * a + o] - t[3 * o + a]) * r, e[a] = (t[3 * a + n] + t[3 * n + a]) * r, e[o] = (t[3 * o + n] + t[3 * n + o]) * r
                      }
                      return e
                    };
                    const Rt = It;
                    var Bt, Ft, zt, Gt, Ut = function () {
                      this._axisX = new vt, this._axisY = new vt, this._axisZ = new vt, this.array = Ye.create(), this._dirty = !0
                    };
                    Ut.prototype = {
                      constructor: Ut,
                      setArray: function (e) {
                        for (var t = 0; t < this.array.length; t++) this.array[t] = e[t];
                        return this._dirty = !0, this
                      },
                      adjoint: function () {
                        return Ye.adjoint(this.array, this.array), this._dirty = !0, this
                      },
                      clone: function () {
                        return (new Ut).copy(this)
                      },
                      copy: function (e) {
                        return Ye.copy(this.array, e.array), this._dirty = !0, this
                      },
                      determinant: function () {
                        return Ye.determinant(this.array)
                      },
                      fromQuat: function (e) {
                        return Ye.fromQuat(this.array, e.array), this._dirty = !0, this
                      },
                      fromRotationTranslation: function (e, t) {
                        return Ye.fromRotationTranslation(this.array, e.array, t.array), this._dirty = !0, this
                      },
                      fromMat2d: function (e) {
                        return Ut.fromMat2d(this, e), this
                      },
                      frustum: function (e, t, r, i, n, a) {
                        return Ye.frustum(this.array, e, t, r, i, n, a), this._dirty = !0, this
                      },
                      identity: function () {
                        return Ye.identity(this.array), this._dirty = !0, this
                      },
                      invert: function () {
                        return Ye.invert(this.array, this.array), this._dirty = !0, this
                      },
                      lookAt: function (e, t, r) {
                        return Ye.lookAt(this.array, e.array, t.array, r.array), this._dirty = !0, this
                      },
                      mul: function (e) {
                        return Ye.mul(this.array, this.array, e.array), this._dirty = !0, this
                      },
                      mulLeft: function (e) {
                        return Ye.mul(this.array, e.array, this.array), this._dirty = !0, this
                      },
                      multiply: function (e) {
                        return Ye.multiply(this.array, this.array, e.array), this._dirty = !0, this
                      },
                      multiplyLeft: function (e) {
                        return Ye.multiply(this.array, e.array, this.array), this._dirty = !0, this
                      },
                      ortho: function (e, t, r, i, n, a) {
                        return Ye.ortho(this.array, e, t, r, i, n, a), this._dirty = !0, this
                      },
                      perspective: function (e, t, r, i) {
                        return Ye.perspective(this.array, e, t, r, i), this._dirty = !0, this
                      },
                      rotate: function (e, t) {
                        return Ye.rotate(this.array, this.array, e, t.array), this._dirty = !0, this
                      },
                      rotateX: function (e) {
                        return Ye.rotateX(this.array, this.array, e), this._dirty = !0, this
                      },
                      rotateY: function (e) {
                        return Ye.rotateY(this.array, this.array, e), this._dirty = !0, this
                      },
                      rotateZ: function (e) {
                        return Ye.rotateZ(this.array, this.array, e), this._dirty = !0, this
                      },
                      scale: function (e) {
                        return Ye.scale(this.array, this.array, e.array), this._dirty = !0, this
                      },
                      translate: function (e) {
                        return Ye.translate(this.array, this.array, e.array), this._dirty = !0, this
                      },
                      transpose: function () {
                        return Ye.transpose(this.array, this.array), this._dirty = !0, this
                      },
                      decomposeMatrix: (Bt = Qe.create(), Ft = Qe.create(), zt = Qe.create(), Gt = Dt.create(), function (e, t, r) {
                        var i = this.array;
                        Qe.set(Bt, i[0], i[1], i[2]), Qe.set(Ft, i[4], i[5], i[6]), Qe.set(zt, i[8], i[9], i[10]);
                        var n = Qe.length(Bt),
                          a = Qe.length(Ft),
                          o = Qe.length(zt);
                        this.determinant() < 0 && (n = -n), e && e.set(n, a, o), r.set(i[12], i[13], i[14]), Dt.fromMat4(Gt, i), Gt[0] /= n, Gt[1] /= n, Gt[2] /= n, Gt[3] /= a, Gt[4] /= a, Gt[5] /= a, Gt[6] /= o, Gt[7] /= o, Gt[8] /= o, Rt.fromMat3(t.array, Gt), Rt.normalize(t.array, t.array), t._dirty = !0, r._dirty = !0
                      }),
                      toString: function () {
                        return "[" + Array.prototype.join.call(this.array, ",") + "]"
                      },
                      toArray: function () {
                        return Array.prototype.slice.call(this.array)
                      }
                    };
                    var kt = Object.defineProperty;
                    if (kt) {
                      var Vt = Ut.prototype;
                      kt(Vt, "z", {
                        get: function () {
                          var e = this.array;
                          return this._axisZ.set(e[8], e[9], e[10]), this._axisZ
                        },
                        set: function (e) {
                          var t = this.array;
                          e = e.array, t[8] = e[0], t[9] = e[1], t[10] = e[2], this._dirty = !0
                        }
                      }), kt(Vt, "y", {
                        get: function () {
                          var e = this.array;
                          return this._axisY.set(e[4], e[5], e[6]), this._axisY
                        },
                        set: function (e) {
                          var t = this.array;
                          e = e.array, t[4] = e[0], t[5] = e[1], t[6] = e[2], this._dirty = !0
                        }
                      }), kt(Vt, "x", {
                        get: function () {
                          var e = this.array;
                          return this._axisX.set(e[0], e[1], e[2]), this._axisX
                        },
                        set: function (e) {
                          var t = this.array;
                          e = e.array, t[0] = e[0], t[1] = e[1], t[2] = e[2], this._dirty = !0
                        }
                      })
                    }
                    Ut.adjoint = function (e, t) {
                      return Ye.adjoint(e.array, t.array), e._dirty = !0, e
                    }, Ut.copy = function (e, t) {
                      return Ye.copy(e.array, t.array), e._dirty = !0, e
                    }, Ut.determinant = function (e) {
                      return Ye.determinant(e.array)
                    }, Ut.identity = function (e) {
                      return Ye.identity(e.array), e._dirty = !0, e
                    }, Ut.ortho = function (e, t, r, i, n, a, o) {
                      return Ye.ortho(e.array, t, r, i, n, a, o), e._dirty = !0, e
                    }, Ut.perspective = function (e, t, r, i, n) {
                      return Ye.perspective(e.array, t, r, i, n), e._dirty = !0, e
                    }, Ut.lookAt = function (e, t, r, i) {
                      return Ye.lookAt(e.array, t.array, r.array, i.array), e._dirty = !0, e
                    }, Ut.invert = function (e, t) {
                      return Ye.invert(e.array, t.array), e._dirty = !0, e
                    }, Ut.multiply = Ut.mul = function (e, t, r) {
                      return Ye.mul(e.array, t.array, r.array), e._dirty = !0, e
                    }, Ut.fromQuat = function (e, t) {
                      return Ye.fromQuat(e.array, t.array), e._dirty = !0, e
                    }, Ut.fromRotationTranslation = function (e, t, r) {
                      return Ye.fromRotationTranslation(e.array, t.array, r.array), e._dirty = !0, e
                    }, Ut.fromMat2d = function (e, t) {
                      return e._dirty = !0, t = t.array, (e = e.array)[0] = t[0], e[4] = t[2], e[12] = t[4], e[1] = t[1], e[5] = t[3], e[13] = t[5], e
                    }, Ut.rotate = function (e, t, r, i) {
                      return Ye.rotate(e.array, t.array, r, i.array), e._dirty = !0, e
                    }, Ut.rotateX = function (e, t, r) {
                      return Ye.rotateX(e.array, t.array, r), e._dirty = !0, e
                    }, Ut.rotateY = function (e, t, r) {
                      return Ye.rotateY(e.array, t.array, r), e._dirty = !0, e
                    }, Ut.rotateZ = function (e, t, r) {
                      return Ye.rotateZ(e.array, t.array, r), e._dirty = !0, e
                    }, Ut.scale = function (e, t, r) {
                      return Ye.scale(e.array, t.array, r.array), e._dirty = !0, e
                    }, Ut.transpose = function (e, t) {
                      return Ye.transpose(e.array, t.array), e._dirty = !0, e
                    }, Ut.translate = function (e, t, r) {
                      return Ye.translate(e.array, t.array, r.array), e._dirty = !0, e
                    };
                    const Ht = Ut;
                    var Wt = function (e, t, r, i) {
                      e = e || 0, t = t || 0, r = r || 0, i = void 0 === i ? 1 : i, this.array = Rt.fromValues(e, t, r, i), this._dirty = !0
                    };
                    Wt.prototype = {
                      constructor: Wt,
                      add: function (e) {
                        return Rt.add(this.array, this.array, e.array), this._dirty = !0, this
                      },
                      calculateW: function () {
                        return Rt.calculateW(this.array, this.array), this._dirty = !0, this
                      },
                      set: function (e, t, r, i) {
                        return this.array[0] = e, this.array[1] = t, this.array[2] = r, this.array[3] = i, this._dirty = !0, this
                      },
                      setArray: function (e) {
                        return this.array[0] = e[0], this.array[1] = e[1], this.array[2] = e[2], this.array[3] = e[3], this._dirty = !0, this
                      },
                      clone: function () {
                        return new Wt(this.x, this.y, this.z, this.w)
                      },
                      conjugate: function () {
                        return Rt.conjugate(this.array, this.array), this._dirty = !0, this
                      },
                      copy: function (e) {
                        return Rt.copy(this.array, e.array), this._dirty = !0, this
                      },
                      dot: function (e) {
                        return Rt.dot(this.array, e.array)
                      },
                      fromMat3: function (e) {
                        return Rt.fromMat3(this.array, e.array), this._dirty = !0, this
                      },
                      fromMat4: function () {
                        var e = Dt.create();
                        return function (t) {
                          return Dt.fromMat4(e, t.array), Dt.transpose(e, e), Rt.fromMat3(this.array, e), this._dirty = !0, this
                        }
                      }(),
                      identity: function () {
                        return Rt.identity(this.array), this._dirty = !0, this
                      },
                      invert: function () {
                        return Rt.invert(this.array, this.array), this._dirty = !0, this
                      },
                      len: function () {
                        return Rt.len(this.array)
                      },
                      length: function () {
                        return Rt.length(this.array)
                      },
                      lerp: function (e, t, r) {
                        return Rt.lerp(this.array, e.array, t.array, r), this._dirty = !0, this
                      },
                      mul: function (e) {
                        return Rt.mul(this.array, this.array, e.array), this._dirty = !0, this
                      },
                      mulLeft: function (e) {
                        return Rt.multiply(this.array, e.array, this.array), this._dirty = !0, this
                      },
                      multiply: function (e) {
                        return Rt.multiply(this.array, this.array, e.array), this._dirty = !0, this
                      },
                      multiplyLeft: function (e) {
                        return Rt.multiply(this.array, e.array, this.array), this._dirty = !0, this
                      },
                      normalize: function () {
                        return Rt.normalize(this.array, this.array), this._dirty = !0, this
                      },
                      rotateX: function (e) {
                        return Rt.rotateX(this.array, this.array, e), this._dirty = !0, this
                      },
                      rotateY: function (e) {
                        return Rt.rotateY(this.array, this.array, e), this._dirty = !0, this
                      },
                      rotateZ: function (e) {
                        return Rt.rotateZ(this.array, this.array, e), this._dirty = !0, this
                      },
                      rotationTo: function (e, t) {
                        return Rt.rotationTo(this.array, e.array, t.array), this._dirty = !0, this
                      },
                      setAxes: function (e, t, r) {
                        return Rt.setAxes(this.array, e.array, t.array, r.array), this._dirty = !0, this
                      },
                      setAxisAngle: function (e, t) {
                        return Rt.setAxisAngle(this.array, e.array, t), this._dirty = !0, this
                      },
                      slerp: function (e, t, r) {
                        return Rt.slerp(this.array, e.array, t.array, r), this._dirty = !0, this
                      },
                      sqrLen: function () {
                        return Rt.sqrLen(this.array)
                      },
                      squaredLength: function () {
                        return Rt.squaredLength(this.array)
                      },
                      fromEuler: function (e, t) {
                        return Wt.fromEuler(this, e, t)
                      },
                      toString: function () {
                        return "[" + Array.prototype.join.call(this.array, ",") + "]"
                      },
                      toArray: function () {
                        return Array.prototype.slice.call(this.array)
                      }
                    };
                    var jt = Object.defineProperty;
                    if (jt) {
                      var Xt = Wt.prototype;
                      jt(Xt, "x", {
                        get: function () {
                          return this.array[0]
                        },
                        set: function (e) {
                          this.array[0] = e, this._dirty = !0
                        }
                      }), jt(Xt, "y", {
                        get: function () {
                          return this.array[1]
                        },
                        set: function (e) {
                          this.array[1] = e, this._dirty = !0
                        }
                      }), jt(Xt, "z", {
                        get: function () {
                          return this.array[2]
                        },
                        set: function (e) {
                          this.array[2] = e, this._dirty = !0
                        }
                      }), jt(Xt, "w", {
                        get: function () {
                          return this.array[3]
                        },
                        set: function (e) {
                          this.array[3] = e, this._dirty = !0
                        }
                      })
                    }
                    Wt.add = function (e, t, r) {
                      return Rt.add(e.array, t.array, r.array), e._dirty = !0, e
                    }, Wt.set = function (e, t, r, i, n) {
                      Rt.set(e.array, t, r, i, n), e._dirty = !0
                    }, Wt.copy = function (e, t) {
                      return Rt.copy(e.array, t.array), e._dirty = !0, e
                    }, Wt.calculateW = function (e, t) {
                      return Rt.calculateW(e.array, t.array), e._dirty = !0, e
                    }, Wt.conjugate = function (e, t) {
                      return Rt.conjugate(e.array, t.array), e._dirty = !0, e
                    }, Wt.identity = function (e) {
                      return Rt.identity(e.array), e._dirty = !0, e
                    }, Wt.invert = function (e, t) {
                      return Rt.invert(e.array, t.array), e._dirty = !0, e
                    }, Wt.dot = function (e, t) {
                      return Rt.dot(e.array, t.array)
                    }, Wt.len = function (e) {
                      return Rt.length(e.array)
                    }, Wt.lerp = function (e, t, r, i) {
                      return Rt.lerp(e.array, t.array, r.array, i), e._dirty = !0, e
                    }, Wt.slerp = function (e, t, r, i) {
                      return Rt.slerp(e.array, t.array, r.array, i), e._dirty = !0, e
                    }, Wt.multiply = Wt.mul = function (e, t, r) {
                      return Rt.multiply(e.array, t.array, r.array), e._dirty = !0, e
                    }, Wt.rotateX = function (e, t, r) {
                      return Rt.rotateX(e.array, t.array, r), e._dirty = !0, e
                    }, Wt.rotateY = function (e, t, r) {
                      return Rt.rotateY(e.array, t.array, r), e._dirty = !0, e
                    }, Wt.rotateZ = function (e, t, r) {
                      return Rt.rotateZ(e.array, t.array, r), e._dirty = !0, e
                    }, Wt.setAxisAngle = function (e, t, r) {
                      return Rt.setAxisAngle(e.array, t.array, r), e._dirty = !0, e
                    }, Wt.normalize = function (e, t) {
                      return Rt.normalize(e.array, t.array), e._dirty = !0, e
                    }, Wt.squaredLength = Wt.sqrLen = function (e) {
                      return Rt.sqrLen(e.array)
                    }, Wt.fromMat3 = function (e, t) {
                      return Rt.fromMat3(e.array, t.array), e._dirty = !0, e
                    }, Wt.setAxes = function (e, t, r, i) {
                      return Rt.setAxes(e.array, t.array, r.array, i.array), e._dirty = !0, e
                    }, Wt.rotationTo = function (e, t, r) {
                      return Rt.rotationTo(e.array, t.array, r.array), e._dirty = !0, e
                    }, Wt.fromEuler = function (e, t, r) {
                      e._dirty = !0, t = t.array;
                      var i = e.array,
                        n = Math.cos(t[0] / 2),
                        a = Math.cos(t[1] / 2),
                        o = Math.cos(t[2] / 2),
                        s = Math.sin(t[0] / 2),
                        l = Math.sin(t[1] / 2),
                        h = Math.sin(t[2] / 2);
                      switch (r = (r || "XYZ").toUpperCase()) {
                        case "XYZ":
                          i[0] = s * a * o + n * l * h, i[1] = n * l * o - s * a * h, i[2] = n * a * h + s * l * o, i[3] = n * a * o - s * l * h;
                          break;
                        case "YXZ":
                          i[0] = s * a * o + n * l * h, i[1] = n * l * o - s * a * h, i[2] = n * a * h - s * l * o, i[3] = n * a * o + s * l * h;
                          break;
                        case "ZXY":
                          i[0] = s * a * o - n * l * h, i[1] = n * l * o + s * a * h, i[2] = n * a * h + s * l * o, i[3] = n * a * o - s * l * h;
                          break;
                        case "ZYX":
                          i[0] = s * a * o - n * l * h, i[1] = n * l * o + s * a * h, i[2] = n * a * h - s * l * o, i[3] = n * a * o + s * l * h;
                          break;
                        case "YZX":
                          i[0] = s * a * o + n * l * h, i[1] = n * l * o + s * a * h, i[2] = n * a * h - s * l * o, i[3] = n * a * o - s * l * h;
                          break;
                        case "XZY":
                          i[0] = s * a * o - n * l * h, i[1] = n * l * o - s * a * h, i[2] = n * a * h + s * l * o, i[3] = n * a * o + s * l * h
                      }
                    };
                    const qt = Wt;
                    var Zt, Yt, Kt, Qt, Jt, $t, er = Qe.set,
                      tr = Qe.copy,
                      rr = function (e, t) {
                        this.min = e || new vt(1 / 0, 1 / 0, 1 / 0), this.max = t || new vt(-1 / 0, -1 / 0, -1 / 0), this.vertices = null
                      };
                    rr.prototype = {
                      constructor: rr,
                      updateFromVertices: function (e) {
                        if (e.length > 0) {
                          var t = this.min,
                            r = this.max,
                            i = t.array,
                            n = r.array;
                          tr(i, e[0]), tr(n, e[0]);
                          for (var a = 1; a < e.length; a++) {
                            var o = e[a];
                            o[0] < i[0] && (i[0] = o[0]), o[1] < i[1] && (i[1] = o[1]), o[2] < i[2] && (i[2] = o[2]), o[0] > n[0] && (n[0] = o[0]), o[1] > n[1] && (n[1] = o[1]), o[2] > n[2] && (n[2] = o[2])
                          }
                          t._dirty = !0, r._dirty = !0
                        }
                      },
                      union: function (e) {
                        var t = this.min,
                          r = this.max;
                        return Qe.min(t.array, t.array, e.min.array), Qe.max(r.array, r.array, e.max.array), t._dirty = !0, r._dirty = !0, this
                      },
                      intersection: function (e) {
                        var t = this.min,
                          r = this.max;
                        return Qe.max(t.array, t.array, e.min.array), Qe.min(r.array, r.array, e.max.array), t._dirty = !0, r._dirty = !0, this
                      },
                      intersectBoundingBox: function (e) {
                        var t = this.min.array,
                          r = this.max.array,
                          i = e.min.array,
                          n = e.max.array;
                        return !(t[0] > n[0] || t[1] > n[1] || t[2] > n[2] || r[0] < i[0] || r[1] < i[1] || r[2] < i[2])
                      },
                      containBoundingBox: function (e) {
                        var t = this.min.array,
                          r = this.max.array,
                          i = e.min.array,
                          n = e.max.array;
                        return t[0] <= i[0] && t[1] <= i[1] && t[2] <= i[2] && r[0] >= n[0] && r[1] >= n[1] && r[2] >= n[2]
                      },
                      containPoint: function (e) {
                        var t = this.min.array,
                          r = this.max.array,
                          i = e.array;
                        return t[0] <= i[0] && t[1] <= i[1] && t[2] <= i[2] && r[0] >= i[0] && r[1] >= i[1] && r[2] >= i[2]
                      },
                      isFinite: function () {
                        var e = this.min.array,
                          t = this.max.array;
                        return isFinite(e[0]) && isFinite(e[1]) && isFinite(e[2]) && isFinite(t[0]) && isFinite(t[1]) && isFinite(t[2])
                      },
                      applyTransform: function (e) {
                        this.transformFrom(this, e)
                      },
                      transformFrom: (Zt = Qe.create(), Yt = Qe.create(), Kt = Qe.create(), Qt = Qe.create(), Jt = Qe.create(), $t = Qe.create(), function (e, t) {
                        var r = e.min.array,
                          i = e.max.array,
                          n = t.array;
                        return Zt[0] = n[0] * r[0], Zt[1] = n[1] * r[0], Zt[2] = n[2] * r[0], Yt[0] = n[0] * i[0], Yt[1] = n[1] * i[0], Yt[2] = n[2] * i[0], Kt[0] = n[4] * r[1], Kt[1] = n[5] * r[1], Kt[2] = n[6] * r[1], Qt[0] = n[4] * i[1], Qt[1] = n[5] * i[1], Qt[2] = n[6] * i[1], Jt[0] = n[8] * r[2], Jt[1] = n[9] * r[2], Jt[2] = n[10] * r[2], $t[0] = n[8] * i[2], $t[1] = n[9] * i[2], $t[2] = n[10] * i[2], r = this.min.array, i = this.max.array, r[0] = Math.min(Zt[0], Yt[0]) + Math.min(Kt[0], Qt[0]) + Math.min(Jt[0], $t[0]) + n[12], r[1] = Math.min(Zt[1], Yt[1]) + Math.min(Kt[1], Qt[1]) + Math.min(Jt[1], $t[1]) + n[13], r[2] = Math.min(Zt[2], Yt[2]) + Math.min(Kt[2], Qt[2]) + Math.min(Jt[2], $t[2]) + n[14], i[0] = Math.max(Zt[0], Yt[0]) + Math.max(Kt[0], Qt[0]) + Math.max(Jt[0], $t[0]) + n[12], i[1] = Math.max(Zt[1], Yt[1]) + Math.max(Kt[1], Qt[1]) + Math.max(Jt[1], $t[1]) + n[13], i[2] = Math.max(Zt[2], Yt[2]) + Math.max(Kt[2], Qt[2]) + Math.max(Jt[2], $t[2]) + n[14], this.min._dirty = !0, this.max._dirty = !0, this
                      }),
                      applyProjection: function (e) {
                        var t = this.min.array,
                          r = this.max.array,
                          i = e.array,
                          n = t[0],
                          a = t[1],
                          o = t[2],
                          s = r[0],
                          l = r[1],
                          h = t[2],
                          u = r[0],
                          c = r[1],
                          d = r[2];
                        if (1 === i[15]) t[0] = i[0] * n + i[12], t[1] = i[5] * a + i[13], r[2] = i[10] * o + i[14], r[0] = i[0] * u + i[12], r[1] = i[5] * c + i[13], t[2] = i[10] * d + i[14];
                        else {
                          var f = -1 / o;
                          t[0] = i[0] * n * f, t[1] = i[5] * a * f, r[2] = (i[10] * o + i[14]) * f, f = -1 / h, r[0] = i[0] * s * f, r[1] = i[5] * l * f, f = -1 / d, t[2] = (i[10] * d + i[14]) * f
                        }
                        return this.min._dirty = !0, this.max._dirty = !0, this
                      },
                      updateVertices: function () {
                        var e = this.vertices;
                        if (!e) {
                          e = [];
                          for (var t = 0; t < 8; t++) e[t] = Qe.fromValues(0, 0, 0);
                          this.vertices = e
                        }
                        var r = this.min.array,
                          i = this.max.array;
                        return er(e[0], r[0], r[1], r[2]), er(e[1], r[0], i[1], r[2]), er(e[2], i[0], r[1], r[2]), er(e[3], i[0], i[1], r[2]), er(e[4], r[0], r[1], i[2]), er(e[5], r[0], i[1], i[2]), er(e[6], i[0], r[1], i[2]), er(e[7], i[0], i[1], i[2]), this
                      },
                      copy: function (e) {
                        var t = this.min,
                          r = this.max;
                        return tr(t.array, e.min.array), tr(r.array, e.max.array), t._dirty = !0, r._dirty = !0, this
                      },
                      clone: function () {
                        var e = new rr;
                        return e.copy(this), e
                      }
                    };
                    const ir = rr;
                    var nr, ar, or = 0;
                    const sr = m.extend({
                      name: "",
                      position: null,
                      rotation: null,
                      scale: null,
                      worldTransform: null,
                      localTransform: null,
                      autoUpdateLocalTransform: !0,
                      _parent: null,
                      _scene: null,
                      _needsUpdateWorldTransform: !0,
                      _inIterating: !1,
                      __depth: 0
                    }, (function () {
                      this.name || (this.name = (this.type || "NODE") + "_" + or++), this.position || (this.position = new vt), this.rotation || (this.rotation = new qt), this.scale || (this.scale = new vt(1, 1, 1)), this.worldTransform = new Ht, this.localTransform = new Ht, this._children = []
                    }), {
                      target: null,
                      invisible: !1,
                      isSkinnedMesh: function () {
                        return !1
                      },
                      isRenderable: function () {
                        return !1
                      },
                      setName: function (e) {
                        var t = this._scene;
                        if (t) {
                          var r = t._nodeRepository;
                          delete r[this.name], r[e] = this
                        }
                        this.name = e
                      },
                      add: function (e) {
                        var t = e._parent;
                        if (t !== this) {
                          t && t.remove(e), e._parent = this, this._children.push(e);
                          var r = this._scene;
                          r && r !== e.scene && e.traverse(this._addSelfToScene, this), e._needsUpdateWorldTransform = !0
                        }
                      },
                      remove: function (e) {
                        var t = this._children,
                          r = t.indexOf(e);
                        r < 0 || (t.splice(r, 1), e._parent = null, this._scene && e.traverse(this._removeSelfFromScene, this))
                      },
                      removeAll: function () {
                        for (var e = this._children, t = 0; t < e.length; t++) e[t]._parent = null, this._scene && e[t].traverse(this._removeSelfFromScene, this);
                        this._children = []
                      },
                      getScene: function () {
                        return this._scene
                      },
                      getParent: function () {
                        return this._parent
                      },
                      _removeSelfFromScene: function (e) {
                        e._scene.removeFromScene(e), e._scene = null
                      },
                      _addSelfToScene: function (e) {
                        this._scene.addToScene(e), e._scene = this._scene
                      },
                      isAncestor: function (e) {
                        for (var t = e._parent; t;) {
                          if (t === this) return !0;
                          t = t._parent
                        }
                        return !1
                      },
                      children: function () {
                        return this._children.slice()
                      },
                      childAt: function (e) {
                        return this._children[e]
                      },
                      getChildByName: function (e) {
                        for (var t = this._children, r = 0; r < t.length; r++)
                          if (t[r].name === e) return t[r]
                      },
                      getDescendantByName: function (e) {
                        for (var t = this._children, r = 0; r < t.length; r++) {
                          var i = t[r];
                          if (i.name === e) return i;
                          var n = i.getDescendantByName(e);
                          if (n) return n
                        }
                      },
                      queryNode: function (e) {
                        if (e) {
                          for (var t = e.split("/"), r = this, i = 0; i < t.length; i++) {
                            var n = t[i];
                            if (n) {
                              for (var a = !1, o = r._children, s = 0; s < o.length; s++) {
                                var l = o[s];
                                if (l.name === n) {
                                  r = l, a = !0;
                                  break
                                }
                              }
                              if (!a) return
                            }
                          }
                          return r
                        }
                      },
                      getPath: function (e) {
                        if (!this._parent) return "/";
                        for (var t = this._parent, r = this.name; t._parent && (r = t.name + "/" + r, t._parent != e);) t = t._parent;
                        return !t._parent && e ? null : r
                      },
                      traverse: function (e, t) {
                        e.call(t, this);
                        for (var r = this._children, i = 0, n = r.length; i < n; i++) r[i].traverse(e, t)
                      },
                      eachChild: function (e, t) {
                        for (var r = this._children, i = 0, n = r.length; i < n; i++) {
                          var a = r[i];
                          e.call(t, a, i)
                        }
                      },
                      setLocalTransform: function (e) {
                        Ye.copy(this.localTransform.array, e.array), this.decomposeLocalTransform()
                      },
                      decomposeLocalTransform: function (e) {
                        var t = e ? null : this.scale;
                        this.localTransform.decomposeMatrix(t, this.rotation, this.position)
                      },
                      setWorldTransform: function (e) {
                        Ye.copy(this.worldTransform.array, e.array), this.decomposeWorldTransform()
                      },
                      decomposeWorldTransform: (ar = Ye.create(), function (e) {
                        var t = this.localTransform,
                          r = this.worldTransform;
                        this._parent ? (Ye.invert(ar, this._parent.worldTransform.array), Ye.multiply(t.array, ar, r.array)) : Ye.copy(t.array, r.array);
                        var i = e ? null : this.scale;
                        t.decomposeMatrix(i, this.rotation, this.position)
                      }),
                      transformNeedsUpdate: function () {
                        return this.position._dirty || this.rotation._dirty || this.scale._dirty
                      },
                      updateLocalTransform: function () {
                        var e = this.position,
                          t = this.rotation,
                          r = this.scale;
                        if (this.transformNeedsUpdate()) {
                          var i = this.localTransform.array;
                          Ye.fromRotationTranslation(i, t.array, e.array), Ye.scale(i, i, r.array), t._dirty = !1, r._dirty = !1, e._dirty = !1, this._needsUpdateWorldTransform = !0
                        }
                      },
                      _updateWorldTransformTopDown: function () {
                        var e = this.localTransform.array,
                          t = this.worldTransform.array;
                        this._parent ? Ye.multiplyAffine(t, this._parent.worldTransform.array, e) : Ye.copy(t, e)
                      },
                      updateWorldTransform: function () {
                        for (var e = this; e && e.getParent() && e.getParent().transformNeedsUpdate();) e = e.getParent();
                        e.update()
                      },
                      update: function (e) {
                        this.autoUpdateLocalTransform ? this.updateLocalTransform() : e = !0, (e || this._needsUpdateWorldTransform) && (this._updateWorldTransformTopDown(), e = !0, this._needsUpdateWorldTransform = !1);
                        for (var t = this._children, r = 0, i = t.length; r < i; r++) t[r].update(e)
                      },
                      getBoundingBox: function () {
                        function e(e) {
                          return !e.invisible && e.geometry
                        }
                        var t = new ir,
                          r = new Ht,
                          i = new Ht;
                        return function (n, a) {
                          return a = a || new ir, n = n || e, this._parent ? Ht.invert(i, this._parent.worldTransform) : Ht.identity(i), this.traverse((function (e) {
                            e.geometry && e.geometry.boundingBox && (t.copy(e.geometry.boundingBox), Ht.multiply(r, i, e.worldTransform), t.applyTransform(r), a.union(t))
                          }), this, e), a
                        }
                      }(),
                      getWorldPosition: function (e) {
                        this.transformNeedsUpdate() && this.updateWorldTransform();
                        var t = this.worldTransform.array;
                        if (e) {
                          var r = e.array;
                          return r[0] = t[12], r[1] = t[13], r[2] = t[14], e
                        }
                        return new vt(t[12], t[13], t[14])
                      },
                      clone: function () {
                        var e = new this.constructor,
                          t = this._children;
                        e.setName(this.name), e.position.copy(this.position), e.rotation.copy(this.rotation), e.scale.copy(this.scale);
                        for (var r = 0; r < t.length; r++) e.add(t[r].clone());
                        return e
                      },
                      rotateAround: function () {
                        var e = new vt,
                          t = new Ht;
                        return function (r, i, n) {
                          e.copy(this.position).subtract(r);
                          var a = this.localTransform;
                          a.identity(), a.translate(r), a.rotate(n, i), t.fromRotationTranslation(this.rotation, e), a.multiply(t), a.scale(this.scale), this.decomposeLocalTransform(), this._needsUpdateWorldTransform = !0
                        }
                      }(),
                      lookAt: (nr = new Ht, function (e, t) {
                        nr.lookAt(this.position, e, t || this.localTransform.y).invert(), this.setLocalTransform(nr), this.target = e
                      })
                    });
                    var lr, hr = sr.extend({
                      material: null,
                      geometry: null,
                      mode: 4,
                      _renderInfo: null
                    }, {
                      __program: null,
                      lightGroup: 0,
                      renderOrder: 0,
                      culling: !0,
                      cullFace: x,
                      frontFace: w,
                      frustumCulling: !0,
                      receiveShadow: !0,
                      castShadow: !0,
                      ignorePicking: !1,
                      ignorePreZ: !1,
                      ignoreGBuffer: !1,
                      isRenderable: function () {
                        return this.geometry && this.material && this.material.shader && !this.invisible && this.geometry.vertexCount > 0
                      },
                      beforeRender: function (e) {},
                      afterRender: function (e, t) {},
                      getBoundingBox: function (e, t) {
                        return t = sr.prototype.getBoundingBox.call(this, e, t), this.geometry && this.geometry.boundingBox && t.union(this.geometry.boundingBox), t
                      },
                      clone: (lr = ["castShadow", "receiveShadow", "mode", "culling", "cullFace", "frontFace", "frustumCulling", "renderOrder", "lineWidth", "ignorePicking", "ignorePreZ", "ignoreGBuffer"], function () {
                        var e = sr.prototype.clone.call(this);
                        e.geometry = this.geometry, e.material = this.material;
                        for (var t = 0; t < lr.length; t++) {
                          var r = lr[t];
                          e[r] !== this[r] && (e[r] = this[r])
                        }
                        return e
                      })
                    });
                    hr.POINTS = 0, hr.LINES = 1, hr.LINE_LOOP = 2, hr.LINE_STRIP = 3, hr.TRIANGLES = 4, hr.TRIANGLE_STRIP = 5, hr.TRIANGLE_FAN = 6, hr.BACK = x, hr.FRONT = y, hr.FRONT_AND_BACK = 1032, hr.CW = b, hr.CCW = w;
                    const ur = hr;
                    var cr, dr, fr, pr, mr, gr = m.extend({
                      scene: null,
                      camera: null,
                      renderer: null
                    }, (function () {
                      this._ray = new Mt, this._ndc = new _e
                    }), {
                      pick: function (e, t, r) {
                        return this.pickAll(e, t, [], r)[0] || null
                      },
                      pickAll: function (e, t, r, i) {
                        return this.renderer.screenToNDC(e, t, this._ndc), this.camera.castRay(this._ndc, this._ray), r = r || [], this._intersectNode(this.scene, r, i || !1), r.sort(this._intersectionCompareFunc), r
                      },
                      _intersectNode: function (e, t, r) {
                        e instanceof ur && e.isRenderable() && (e.ignorePicking && !r || !(4 === e.mode && e.geometry.isUseIndices() || e.geometry.pickByRay || e.geometry.pick) || this._intersectRenderable(e, t));
                        for (var i = 0; i < e._children.length; i++) this._intersectNode(e._children[i], t, r)
                      },
                      _intersectRenderable: (cr = new vt, dr = new vt, fr = new vt, pr = new Mt, mr = new Ht, function (e, t) {
                        var r = e.isSkinnedMesh();
                        pr.copy(this._ray), Ht.invert(mr, e.worldTransform), r || pr.applyTransform(mr);
                        var i = e.geometry,
                          n = r ? e.skeleton.boundingBox : i.boundingBox;
                        if (!n || pr.intersectBoundingBox(n))
                          if (i.pick) i.pick(this._ndc.x, this._ndc.y, this.renderer, this.camera, e, t);
                          else if (i.pickByRay) i.pickByRay(pr, e, t);
                        else {
                          var a, o, s = e.cullFace === x && e.frontFace === w || e.cullFace === y && e.frontFace === b,
                            l = i.indices,
                            h = i.attributes.position,
                            u = i.attributes.weight,
                            c = i.attributes.joint,
                            d = [];
                          if (h && h.value && l) {
                            if (r) {
                              o = e.skeleton.getSubSkinMatrices(e.__uid__, e.joints);
                              for (var f = 0; f < e.joints.length; f++) {
                                d[f] = d[f] || [];
                                for (var p = 0; p < 16; p++) d[f][p] = o[16 * f + p]
                              }
                              var m = [],
                                g = [],
                                _ = [],
                                v = [],
                                T = [],
                                S = i.attributes.skinnedPosition;
                              for (S && S.value || (i.createAttribute("skinnedPosition", "f", 3), (S = i.attributes.skinnedPosition).init(i.vertexCount)), f = 0; f < i.vertexCount; f++) {
                                for (h.get(f, m), u.get(f, g), c.get(f, _), g[3] = 1 - g[0] - g[1] - g[2], Qe.set(v, 0, 0, 0), p = 0; p < 4; p++) _[p] >= 0 && g[p] > 1e-4 && (Qe.transformMat4(T, m, d[_[p]]), Qe.scaleAndAdd(v, v, T, g[p]));
                                S.set(f, v)
                              }
                            }
                            for (f = 0; f < l.length; f += 3) {
                              var M = l[f],
                                A = l[f + 1],
                                E = l[f + 2],
                                C = r ? i.attributes.skinnedPosition : h;
                              if (C.get(M, cr.array), C.get(A, dr.array), C.get(E, fr.array), a = s ? pr.intersectTriangle(cr, dr, fr, e.culling) : pr.intersectTriangle(cr, fr, dr, e.culling)) {
                                var D = new vt;
                                r ? vt.copy(D, a) : vt.transformMat4(D, a, e.worldTransform), t.push(new gr.Intersection(a, D, e, [M, A, E], f / 3, vt.dist(D, this._ray.origin)))
                              }
                            }
                          }
                        }
                      }),
                      _intersectionCompareFunc: function (e, t) {
                        return e.distance - t.distance
                      }
                    });
                    gr.Intersection = function (e, t, r, i, n, a) {
                      this.point = e, this.pointWorld = t, this.target = r, this.triangle = i, this.triangleIndex = n, this.distance = a
                    };
                    const _r = gr;
                    var vr = "__dt__",
                      yr = function () {
                        this._contextId = 0, this._caches = [], this._context = {}
                      };
                    (yr.prototype = {
                      use: function (e, t) {
                        var r = this._caches;
                        r[e] || (r[e] = {}, t && (r[e] = t())), this._contextId = e, this._context = r[e]
                      },
                      put: function (e, t) {
                        this._context[e] = t
                      },
                      get: function (e) {
                        return this._context[e]
                      },
                      dirty: function (e) {
                        var t = vr + (e = e || "");
                        this.put(t, !0)
                      },
                      dirtyAll: function (e) {
                        for (var t = vr + (e = e || ""), r = this._caches, i = 0; i < r.length; i++) r[i] && (r[i][t] = !0)
                      },
                      fresh: function (e) {
                        var t = vr + (e = e || "");
                        this.put(t, !1)
                      },
                      freshAll: function (e) {
                        for (var t = vr + (e = e || ""), r = this._caches, i = 0; i < r.length; i++) r[i] && (r[i][t] = !1)
                      },
                      isDirty: function (e) {
                        var t = vr + (e = e || ""),
                          r = this._context;
                        return !r.hasOwnProperty(t) || !0 === r[t]
                      },
                      deleteContext: function (e) {
                        delete this._caches[e], this._context = {}
                      },
                      delete: function (e) {
                        delete this._context[e]
                      },
                      clearAll: function () {
                        this._caches = {}
                      },
                      getContext: function () {
                        return this._context
                      },
                      eachContext: function (e, t) {
                        Object.keys(this._caches).forEach((function (r) {
                          e && e.call(t, r)
                        }))
                      },
                      miss: function (e) {
                        return !this._context.hasOwnProperty(e)
                      }
                    }).constructor = yr;
                    const xr = yr;
                    var br = m.extend({
                      width: 512,
                      height: 512,
                      type: T,
                      format: A,
                      wrapS: N,
                      wrapT: N,
                      minFilter: O,
                      magFilter: C,
                      useMipmap: !0,
                      anisotropic: 1,
                      flipY: !0,
                      sRGB: !0,
                      unpackAlignment: 4,
                      premultiplyAlpha: !1,
                      dynamic: !1,
                      NPOT: !1,
                      __used: 0
                    }, (function () {
                      this._cache = new xr
                    }), {
                      getWebGLTexture: function (e) {
                        var t = e.gl,
                          r = this._cache;
                        return r.use(e.__uid__), r.miss("webgl_texture") && r.put("webgl_texture", t.createTexture()), this.dynamic ? this.update(e) : r.isDirty() && (this.update(e), r.fresh()), r.get("webgl_texture")
                      },
                      bind: function () {},
                      unbind: function () {},
                      dirty: function () {
                        this._cache && this._cache.dirtyAll()
                      },
                      update: function (e) {},
                      updateCommon: function (e) {
                        var t = e.gl;
                        t.pixelStorei(t.UNPACK_FLIP_Y_WEBGL, this.flipY), t.pixelStorei(t.UNPACK_PREMULTIPLY_ALPHA_WEBGL, this.premultiplyAlpha), t.pixelStorei(t.UNPACK_ALIGNMENT, this.unpackAlignment), this.format === M && (this.useMipmap = !1);
                        var r = e.getGLExtension("EXT_sRGB");
                        this.format !== br.SRGB || r || (this.format = br.RGB), this.format !== br.SRGB_ALPHA || r || (this.format = br.RGBA), this.NPOT = !this.isPowerOfTwo()
                      },
                      getAvailableWrapS: function () {
                        return this.NPOT ? I : this.wrapS
                      },
                      getAvailableWrapT: function () {
                        return this.NPOT ? I : this.wrapT
                      },
                      getAvailableMinFilter: function () {
                        var e = this.minFilter;
                        return this.NPOT || !this.useMipmap ? e === D || e === P ? E : e === O || e === L ? C : e : e
                      },
                      getAvailableMagFilter: function () {
                        return this.magFilter
                      },
                      nextHighestPowerOfTwo: function (e) {
                        --e;
                        for (var t = 1; t < 32; t <<= 1) e |= e >> t;
                        return e + 1
                      },
                      dispose: function (e) {
                        var t = this._cache;
                        t.use(e.__uid__);
                        var r = t.get("webgl_texture");
                        r && e.gl.deleteTexture(r), t.deleteContext(e.__uid__)
                      },
                      isRenderable: function () {},
                      isPowerOfTwo: function () {}
                    });
                    Object.defineProperty(br.prototype, "width", {
                      get: function () {
                        return this._width
                      },
                      set: function (e) {
                        this._width = e
                      }
                    }), Object.defineProperty(br.prototype, "height", {
                      get: function () {
                        return this._height
                      },
                      set: function (e) {
                        this._height = e
                      }
                    }), br.BYTE = 5120, br.UNSIGNED_BYTE = T, br.SHORT = 5122, br.UNSIGNED_SHORT = 5123, br.INT = 5124, br.UNSIGNED_INT = 5125, br.FLOAT = S, br.HALF_FLOAT = 36193, br.UNSIGNED_INT_24_8_WEBGL = 34042, br.DEPTH_COMPONENT = M, br.DEPTH_STENCIL = 34041, br.ALPHA = 6406, br.RGB = 6407, br.RGBA = A, br.LUMINANCE = 6409, br.LUMINANCE_ALPHA = 6410, br.SRGB = 35904, br.SRGB_ALPHA = 35906, br.COMPRESSED_RGB_S3TC_DXT1_EXT = 33776, br.COMPRESSED_RGBA_S3TC_DXT1_EXT = 33777, br.COMPRESSED_RGBA_S3TC_DXT3_EXT = 33778, br.COMPRESSED_RGBA_S3TC_DXT5_EXT = 33779, br.NEAREST = E, br.LINEAR = C, br.NEAREST_MIPMAP_NEAREST = D, br.LINEAR_MIPMAP_NEAREST = L, br.NEAREST_MIPMAP_LINEAR = P, br.LINEAR_MIPMAP_LINEAR = O, br.REPEAT = N, br.CLAMP_TO_EDGE = I, br.MIRRORED_REPEAT = 33648;
                    const wr = br;
                    var Tr = ur.extend({
                      skeleton: null,
                      joints: null
                    }, (function () {
                      this.joints || (this.joints = [])
                    }), {
                      offsetMatrix: null,
                      isInstancedMesh: function () {
                        return !1
                      },
                      isSkinnedMesh: function () {
                        return !!(this.skeleton && this.joints && this.joints.length > 0)
                      },
                      clone: function () {
                        var e = ur.prototype.clone.call(this);
                        return e.skeleton = this.skeleton, this.joints && (e.joints = this.joints.slice()), e
                      }
                    });
                    Tr.POINTS = 0, Tr.LINES = 1, Tr.LINE_LOOP = 2, Tr.LINE_STRIP = 3, Tr.TRIANGLES = 4, Tr.TRIANGLE_STRIP = 5, Tr.TRIANGLE_FAN = 6, Tr.BACK = x, Tr.FRONT = y, Tr.FRONT_AND_BACK = 1032, Tr.CW = b, Tr.CCW = w;
                    const Sr = Tr;
                    const Mr = {
                      isPowerOfTwo: function (e) {
                        return 0 == (e & e - 1)
                      },
                      nextPowerOfTwo: function (e) {
                        return e--, e |= e >> 1, e |= e >> 2, e |= e >> 4, e |= e >> 8, e |= e >> 16, ++e
                      },
                      nearestPowerOfTwo: function (e) {
                        return Math.pow(2, Math.round(Math.log(e) / Math.LN2))
                      }
                    };
                    var Ar = Mr.isPowerOfTwo;

                    function Er(e) {
                      return Math.pow(2, Math.round(Math.log(e) / Math.LN2))
                    }
                    var Cr = wr.extend((function () {
                      return {
                        image: null,
                        pixels: null,
                        mipmaps: [],
                        convertToPOT: !1
                      }
                    }), {
                      textureType: "texture2D",
                      update: function (e) {
                        var t = e.gl;
                        t.bindTexture(t.TEXTURE_2D, this._cache.get("webgl_texture")), this.updateCommon(e);
                        var r = this.format,
                          i = this.type,
                          n = !(!this.convertToPOT || this.mipmaps.length || !this.image || this.wrapS !== wr.REPEAT && this.wrapT !== wr.REPEAT || !this.NPOT);
                        t.texParameteri(t.TEXTURE_2D, t.TEXTURE_WRAP_S, n ? this.wrapS : this.getAvailableWrapS()), t.texParameteri(t.TEXTURE_2D, t.TEXTURE_WRAP_T, n ? this.wrapT : this.getAvailableWrapT()), t.texParameteri(t.TEXTURE_2D, t.TEXTURE_MAG_FILTER, n ? this.magFilter : this.getAvailableMagFilter()), t.texParameteri(t.TEXTURE_2D, t.TEXTURE_MIN_FILTER, n ? this.minFilter : this.getAvailableMinFilter());
                        var a = e.getGLExtension("EXT_texture_filter_anisotropic");
                        if (a && this.anisotropic > 1 && t.texParameterf(t.TEXTURE_2D, a.TEXTURE_MAX_ANISOTROPY_EXT, this.anisotropic), 36193 === i && (e.getGLExtension("OES_texture_half_float") || (i = S)), this.mipmaps.length)
                          for (var o = this.width, s = this.height, l = 0; l < this.mipmaps.length; l++) {
                            var h = this.mipmaps[l];
                            this._updateTextureData(t, h, l, o, s, r, i, !1), o /= 2, s /= 2
                          } else this._updateTextureData(t, this, 0, this.width, this.height, r, i, n), !this.useMipmap || this.NPOT && !n || t.generateMipmap(t.TEXTURE_2D);
                        t.bindTexture(t.TEXTURE_2D, null)
                      },
                      _updateTextureData: function (e, t, r, i, n, a, o, s) {
                        if (t.image) {
                          var l = t.image;
                          s && (this._potCanvas = function (e, t) {
                            var r = Er(e.width),
                              i = Er(e.height);
                            return (t = t || document.createElement("canvas")).width = r, t.height = i, t.getContext("2d").drawImage(e.image, 0, 0, r, i), t
                          }(this, this._potCanvas), l = this._potCanvas), e.texImage2D(e.TEXTURE_2D, r, a, a, o, l)
                        } else a <= wr.COMPRESSED_RGBA_S3TC_DXT5_EXT && a >= wr.COMPRESSED_RGB_S3TC_DXT1_EXT ? e.compressedTexImage2D(e.TEXTURE_2D, r, a, i, n, 0, t.pixels) : e.texImage2D(e.TEXTURE_2D, r, a, i, n, 0, a, o, t.pixels)
                      },
                      generateMipmap: function (e) {
                        var t = e.gl;
                        this.useMipmap && !this.NPOT && (t.bindTexture(t.TEXTURE_2D, this._cache.get("webgl_texture")), t.generateMipmap(t.TEXTURE_2D))
                      },
                      isPowerOfTwo: function () {
                        return Ar(this.width) && Ar(this.height)
                      },
                      isRenderable: function () {
                        return this.image ? this.image.width > 0 && this.image.height > 0 : !(!this.width || !this.height)
                      },
                      bind: function (e) {
                        e.gl.bindTexture(e.gl.TEXTURE_2D, this.getWebGLTexture(e))
                      },
                      unbind: function (e) {
                        e.gl.bindTexture(e.gl.TEXTURE_2D, null)
                      },
                      load: function (e, t) {
                        var r = U.createImage();
                        t && (r.crossOrigin = t);
                        var i = this;
                        return r.onload = function () {
                          i.dirty(), i.trigger("success", i)
                        }, r.onerror = function () {
                          i.trigger("error", i)
                        }, r.src = e, this.image = r, this
                      }
                    });
                    Object.defineProperty(Cr.prototype, "width", {
                      get: function () {
                        return this.image ? this.image.width : this._width
                      },
                      set: function (e) {
                        this.image ? console.warn("Texture from image can't set width") : (this._width !== e && this.dirty(), this._width = e)
                      }
                    }), Object.defineProperty(Cr.prototype, "height", {
                      get: function () {
                        return this.image ? this.image.height : this._height
                      },
                      set: function (e) {
                        this.image ? console.warn("Texture from image can't set height") : (this._height !== e && this.dirty(), this._height = e)
                      }
                    });
                    const Dr = Cr;

                    function Lr(e) {
                      return {
                        byte: U.Int8Array,
                        ubyte: U.Uint8Array,
                        short: U.Int16Array,
                        ushort: U.Uint16Array
                      } [e] || U.Float32Array
                    }

                    function Pr(e) {
                      return "attr_" + e
                    }

                    function Or(e, t, r, i) {
                      switch (this.name = e, this.type = t, this.size = r, this.semantic = i || "", this.value = null, r) {
                        case 1:
                          this.get = function (e) {
                            return this.value[e]
                          }, this.set = function (e, t) {
                            this.value[e] = t
                          }, this.copy = function (e, t) {
                            this.value[e] = this.value[e]
                          };
                          break;
                        case 2:
                          this.get = function (e, t) {
                            var r = this.value;
                            return t[0] = r[2 * e], t[1] = r[2 * e + 1], t
                          }, this.set = function (e, t) {
                            var r = this.value;
                            r[2 * e] = t[0], r[2 * e + 1] = t[1]
                          }, this.copy = function (e, t) {
                            var r = this.value;
                            t *= 2, r[e *= 2] = r[t], r[e + 1] = r[t + 1]
                          };
                          break;
                        case 3:
                          this.get = function (e, t) {
                            var r = 3 * e,
                              i = this.value;
                            return t[0] = i[r], t[1] = i[r + 1], t[2] = i[r + 2], t
                          }, this.set = function (e, t) {
                            var r = 3 * e,
                              i = this.value;
                            i[r] = t[0], i[r + 1] = t[1], i[r + 2] = t[2]
                          }, this.copy = function (e, t) {
                            var r = this.value;
                            t *= 3, r[e *= 3] = r[t], r[e + 1] = r[t + 1], r[e + 2] = r[t + 2]
                          };
                          break;
                        case 4:
                          this.get = function (e, t) {
                            var r = this.value,
                              i = 4 * e;
                            return t[0] = r[i], t[1] = r[i + 1], t[2] = r[i + 2], t[3] = r[i + 3], t
                          }, this.set = function (e, t) {
                            var r = this.value,
                              i = 4 * e;
                            r[i] = t[0], r[i + 1] = t[1], r[i + 2] = t[2], r[i + 3] = t[3]
                          }, this.copy = function (e, t) {
                            var r = this.value;
                            t *= 4, r[e *= 4] = r[t], r[e + 1] = r[t + 1], r[e + 2] = r[t + 2], r[e + 3] = r[t + 3]
                          }
                      }
                    }

                    function Nr(e, t, r, i, n) {
                      this.name = e, this.type = t, this.buffer = r, this.size = i, this.semantic = n, this.symbol = "", this.needsRemove = !1
                    }

                    function Ir(e) {
                      this.buffer = e, this.count = 0
                    }
                    Or.prototype.init = function (e) {
                      if (!this.value || this.value.length !== e * this.size) {
                        var t = Lr(this.type);
                        this.value = new t(e * this.size)
                      }
                    }, Or.prototype.fromArray = function (e) {
                      var t, r = Lr(this.type);
                      if (e[0] && e[0].length) {
                        var i = 0,
                          n = this.size;
                        t = new r(e.length * n);
                        for (var a = 0; a < e.length; a++)
                          for (var o = 0; o < n; o++) t[i++] = e[a][o]
                      } else t = new r(e);
                      this.value = t
                    }, Or.prototype.clone = function (e) {
                      var t = new Or(this.name, this.type, this.size, this.semantic);
                      return e && console.warn("todo"), t
                    };
                    var Rr = m.extend((function () {
                      return {
                        attributes: {},
                        indices: null,
                        dynamic: !0,
                        _enabledAttributes: null,
                        __used: 0
                      }
                    }), (function () {
                      this._cache = new xr, this._attributeList = Object.keys(this.attributes), this.__vaoCache = {}
                    }), {
                      mainAttribute: "",
                      pick: null,
                      pickByRay: null,
                      dirty: function () {
                        for (var e = this.getEnabledAttributes(), t = 0; t < e.length; t++) this.dirtyAttribute(e[t]);
                        this.dirtyIndices(), this._enabledAttributes = null, this._cache.dirty("any")
                      },
                      dirtyIndices: function () {
                        this._cache.dirtyAll("indices")
                      },
                      dirtyAttribute: function (e) {
                        this._cache.dirtyAll(Pr(e)), this._cache.dirtyAll("attributes")
                      },
                      getTriangleIndices: function (e, t) {
                        if (e < this.triangleCount && e >= 0) {
                          t || (t = []);
                          var r = this.indices;
                          return t[0] = r[3 * e], t[1] = r[3 * e + 1], t[2] = r[3 * e + 2], t
                        }
                      },
                      setTriangleIndices: function (e, t) {
                        var r = this.indices;
                        r[3 * e] = t[0], r[3 * e + 1] = t[1], r[3 * e + 2] = t[2]
                      },
                      isUseIndices: function () {
                        return !!this.indices
                      },
                      initIndicesFromArray: function (e) {
                        var t, r = this.vertexCount > 65535 ? U.Uint32Array : U.Uint16Array;
                        if (e[0] && e[0].length) {
                          var i = 0;
                          t = new r(3 * e.length);
                          for (var n = 0; n < e.length; n++)
                            for (var a = 0; a < 3; a++) t[i++] = e[n][a]
                        } else t = new r(e);
                        this.indices = t
                      },
                      createAttribute: function (e, t, r, i) {
                        var n = new Or(e, t, r, i);
                        return this.attributes[e] && this.removeAttribute(e), this.attributes[e] = n, this._attributeList.push(e), n
                      },
                      removeAttribute: function (e) {
                        var t = this._attributeList,
                          r = t.indexOf(e);
                        return r >= 0 && (t.splice(r, 1), delete this.attributes[e], !0)
                      },
                      getAttribute: function (e) {
                        return this.attributes[e]
                      },
                      getEnabledAttributes: function () {
                        var e = this._enabledAttributes,
                          t = this._attributeList;
                        if (e) return e;
                        for (var r = [], i = this.vertexCount, n = 0; n < t.length; n++) {
                          var a = t[n],
                            o = this.attributes[a];
                          o.value && o.value.length === i * o.size && r.push(a)
                        }
                        return this._enabledAttributes = r, r
                      },
                      getBufferChunks: function (e) {
                        var t = this._cache;
                        t.use(e.__uid__);
                        var r = t.isDirty("attributes"),
                          i = t.isDirty("indices");
                        if (r || i) {
                          this._updateBuffer(e.gl, r, i);
                          for (var n = this.getEnabledAttributes(), a = 0; a < n.length; a++) t.fresh(Pr(n[a]));
                          t.fresh("attributes"), t.fresh("indices")
                        }
                        return t.fresh("any"), t.get("chunks")
                      },
                      _updateBuffer: function (e, t, r) {
                        var i = this._cache,
                          n = i.get("chunks"),
                          a = !1;
                        n || ((n = [])[0] = {
                          attributeBuffers: [],
                          indicesBuffer: null
                        }, i.put("chunks", n), a = !0);
                        var o = n[0],
                          s = o.attributeBuffers,
                          l = o.indicesBuffer;
                        if (t || a) {
                          var h = this.getEnabledAttributes(),
                            u = {};
                          if (!a)
                            for (var c = 0; c < s.length; c++) u[s[c].name] = s[c];
                          for (var d = 0; d < h.length; d++) {
                            var f, p, m = h[d],
                              g = this.attributes[m];
                            a || (f = u[m]), p = f ? f.buffer : e.createBuffer(), i.isDirty(Pr(m)) && (e.bindBuffer(e.ARRAY_BUFFER, p), e.bufferData(e.ARRAY_BUFFER, g.value, this.dynamic ? e.DYNAMIC_DRAW : e.STATIC_DRAW)), s[d] = new Nr(m, g.type, p, g.size, g.semantic)
                          }
                          for (c = d; c < s.length; c++) e.deleteBuffer(s[c].buffer);
                          s.length = d
                        }
                        this.isUseIndices() && (r || a) && (l || (l = new Ir(e.createBuffer()), o.indicesBuffer = l), l.count = this.indices.length, e.bindBuffer(e.ELEMENT_ARRAY_BUFFER, l.buffer), e.bufferData(e.ELEMENT_ARRAY_BUFFER, this.indices, this.dynamic ? e.DYNAMIC_DRAW : e.STATIC_DRAW))
                      },
                      dispose: function (e) {
                        var t = this._cache;
                        t.use(e.__uid__);
                        var r = t.get("chunks");
                        if (r)
                          for (var i = 0; i < r.length; i++) {
                            for (var n = r[i], a = 0; a < n.attributeBuffers.length; a++) {
                              var o = n.attributeBuffers[a];
                              e.gl.deleteBuffer(o.buffer)
                            }
                            n.indicesBuffer && e.gl.deleteBuffer(n.indicesBuffer.buffer)
                          }
                        if (this.__vaoCache) {
                          var s = e.getGLExtension("OES_vertex_array_object");
                          for (var l in this.__vaoCache) {
                            var h = this.__vaoCache[l].vao;
                            h && s.deleteVertexArrayOES(h)
                          }
                        }
                        this.__vaoCache = {}, t.deleteContext(e.__uid__)
                      }
                    });
                    Object.defineProperty && (Object.defineProperty(Rr.prototype, "vertexCount", {
                      enumerable: !1,
                      get: function () {
                        var e = this.attributes[this.mainAttribute];
                        return e || (e = this.attributes[this._attributeList[0]]), e && e.value ? e.value.length / e.size : 0
                      }
                    }), Object.defineProperty(Rr.prototype, "triangleCount", {
                      enumerable: !1,
                      get: function () {
                        var e = this.indices;
                        return e ? e.length / 3 : 0
                      }
                    })), Rr.STATIC_DRAW = 35044, Rr.DYNAMIC_DRAW = 35048, Rr.STREAM_DRAW = 35040, Rr.AttributeBuffer = Nr, Rr.IndicesBuffer = Ir, Rr.Attribute = Or;
                    const Br = Rr;
                    var Fr = Qe.create,
                      zr = Qe.add,
                      Gr = Qe.set,
                      Ur = Br.Attribute,
                      kr = Br.extend((function () {
                        return {
                          attributes: {
                            position: new Ur("position", "float", 3, "POSITION"),
                            texcoord0: new Ur("texcoord0", "float", 2, "TEXCOORD_0"),
                            texcoord1: new Ur("texcoord1", "float", 2, "TEXCOORD_1"),
                            normal: new Ur("normal", "float", 3, "NORMAL"),
                            tangent: new Ur("tangent", "float", 4, "TANGENT"),
                            color: new Ur("color", "float", 4, "COLOR"),
                            weight: new Ur("weight", "float", 3, "WEIGHT"),
                            joint: new Ur("joint", "float", 4, "JOINT"),
                            barycentric: new Ur("barycentric", "float", 3, null)
                          },
                          boundingBox: null
                        }
                      }), {
                        mainAttribute: "position",
                        updateBoundingBox: function () {
                          var e = this.boundingBox;
                          e || (e = this.boundingBox = new ir);
                          var t = this.attributes.position.value;
                          if (t && t.length) {
                            var r = e.min,
                              i = e.max,
                              n = r.array,
                              a = i.array;
                            Qe.set(n, t[0], t[1], t[2]), Qe.set(a, t[0], t[1], t[2]);
                            for (var o = 3; o < t.length;) {
                              var s = t[o++],
                                l = t[o++],
                                h = t[o++];
                              s < n[0] && (n[0] = s), l < n[1] && (n[1] = l), h < n[2] && (n[2] = h), s > a[0] && (a[0] = s), l > a[1] && (a[1] = l), h > a[2] && (a[2] = h)
                            }
                            r._dirty = !0, i._dirty = !0
                          }
                        },
                        generateVertexNormals: function () {
                          if (this.vertexCount) {
                            var e = this.indices,
                              t = this.attributes,
                              r = t.position.value,
                              i = t.normal.value;
                            if (i && i.length === r.length)
                              for (var n = 0; n < i.length; n++) i[n] = 0;
                            else i = t.normal.value = new U.Float32Array(r.length);
                            for (var a, o, s, l = Fr(), h = Fr(), u = Fr(), c = Fr(), d = Fr(), f = Fr(), p = e ? e.length : this.vertexCount, m = 0; m < p;)
                              for (e ? (a = e[m++], o = e[m++], s = e[m++]) : (a = m++, o = m++, s = m++), Gr(l, r[3 * a], r[3 * a + 1], r[3 * a + 2]), Gr(h, r[3 * o], r[3 * o + 1], r[3 * o + 2]), Gr(u, r[3 * s], r[3 * s + 1], r[3 * s + 2]), Qe.sub(c, l, h), Qe.sub(d, h, u), Qe.cross(f, c, d), n = 0; n < 3; n++) i[3 * a + n] = i[3 * a + n] + f[n], i[3 * o + n] = i[3 * o + n] + f[n], i[3 * s + n] = i[3 * s + n] + f[n];
                            for (n = 0; n < i.length;) Gr(f, i[n], i[n + 1], i[n + 2]), Qe.normalize(f, f), i[n++] = f[0], i[n++] = f[1], i[n++] = f[2];
                            this.dirty()
                          }
                        },
                        generateFaceNormals: function () {
                          if (this.vertexCount) {
                            this.isUniqueVertex() || this.generateUniqueVertex();
                            var e = this.indices,
                              t = this.attributes,
                              r = t.position.value,
                              i = t.normal.value,
                              n = Fr(),
                              a = Fr(),
                              o = Fr(),
                              s = Fr(),
                              l = Fr(),
                              h = Fr();
                            i || (i = t.normal.value = new Float32Array(r.length));
                            for (var u, c, d, f = e ? e.length : this.vertexCount, p = 0; p < f;) {
                              e ? (u = e[p++], c = e[p++], d = e[p++]) : (u = p++, c = p++, d = p++), Gr(n, r[3 * u], r[3 * u + 1], r[3 * u + 2]), Gr(a, r[3 * c], r[3 * c + 1], r[3 * c + 2]), Gr(o, r[3 * d], r[3 * d + 1], r[3 * d + 2]), Qe.sub(s, n, a), Qe.sub(l, a, o), Qe.cross(h, s, l), Qe.normalize(h, h);
                              for (var m = 0; m < 3; m++) i[3 * u + m] = h[m], i[3 * c + m] = h[m], i[3 * d + m] = h[m]
                            }
                            this.dirty()
                          }
                        },
                        generateTangents: function () {
                          if (this.vertexCount) {
                            var e = this.vertexCount,
                              t = this.attributes;
                            t.tangent.value || (t.tangent.value = new Float32Array(4 * e));
                            var r = t.texcoord0.value,
                              i = t.position.value,
                              n = t.tangent.value,
                              a = t.normal.value;
                            if (r) {
                              for (var o = [], s = [], l = 0; l < e; l++) o[l] = [0, 0, 0], s[l] = [0, 0, 0];
                              var h, u, c, d = [0, 0, 0],
                                f = [0, 0, 0],
                                p = this.indices,
                                m = p ? p.length : this.vertexCount;
                              for (l = 0; l < m;) {
                                p ? (h = p[l++], u = p[l++], c = p[l++]) : (h = l++, u = l++, c = l++);
                                var g = r[2 * h],
                                  _ = r[2 * u],
                                  v = r[2 * c],
                                  y = r[2 * h + 1],
                                  x = r[2 * u + 1],
                                  b = r[2 * c + 1],
                                  w = i[3 * h],
                                  T = i[3 * u],
                                  S = i[3 * c],
                                  M = i[3 * h + 1],
                                  A = i[3 * u + 1],
                                  E = i[3 * c + 1],
                                  C = i[3 * h + 2],
                                  D = T - w,
                                  L = S - w,
                                  P = A - M,
                                  O = E - M,
                                  N = i[3 * u + 2] - C,
                                  I = i[3 * c + 2] - C,
                                  R = _ - g,
                                  B = v - g,
                                  F = x - y,
                                  z = b - y,
                                  G = 1 / (R * z - F * B);
                                d[0] = (z * D - F * L) * G, d[1] = (z * P - F * O) * G, d[2] = (z * N - F * I) * G, f[0] = (R * L - B * D) * G, f[1] = (R * O - B * P) * G, f[2] = (R * I - B * N) * G, zr(o[h], o[h], d), zr(o[u], o[u], d), zr(o[c], o[c], d), zr(s[h], s[h], f), zr(s[u], s[u], f), zr(s[c], s[c], f)
                              }
                              var U = Fr(),
                                k = Fr(),
                                V = Fr();
                              for (l = 0; l < e; l++) {
                                V[0] = a[3 * l], V[1] = a[3 * l + 1], V[2] = a[3 * l + 2];
                                var H = o[l];
                                Qe.scale(U, V, Qe.dot(V, H)), Qe.sub(U, H, U), Qe.normalize(U, U), Qe.cross(k, V, H), n[4 * l] = U[0], n[4 * l + 1] = U[1], n[4 * l + 2] = U[2], n[4 * l + 3] = Qe.dot(k, s[l]) < 0 ? -1 : 1
                              }
                              this.dirty()
                            } else console.warn("Geometry without texcoords can't generate tangents.")
                          }
                        },
                        isUniqueVertex: function () {
                          return !this.isUseIndices() || this.vertexCount === this.indices.length
                        },
                        generateUniqueVertex: function () {
                          if (this.vertexCount && this.indices) {
                            this.indices.length > 65535 && (this.indices = new U.Uint32Array(this.indices));
                            for (var e = this.attributes, t = this.indices, r = this.getEnabledAttributes(), i = {}, n = 0; n < r.length; n++) i[l = r[n]] = e[l].value, e[l].init(this.indices.length);
                            for (var a = 0, o = 0; o < t.length; o++) {
                              var s = t[o];
                              for (n = 0; n < r.length; n++)
                                for (var l, h = e[l = r[n]].value, u = e[l].size, c = 0; c < u; c++) h[a * u + c] = i[l][s * u + c];
                              t[o] = a, a++
                            }
                            this.dirty()
                          }
                        },
                        generateBarycentric: function () {
                          if (this.vertexCount) {
                            this.isUniqueVertex() || this.generateUniqueVertex();
                            var e = this.attributes,
                              t = e.barycentric.value,
                              r = this.indices;
                            if (!t || t.length !== 3 * r.length) {
                              t = e.barycentric.value = new Float32Array(3 * r.length);
                              for (var i = 0; i < (r ? r.length : this.vertexCount / 3);)
                                for (var n = 0; n < 3; n++) t[3 * (r ? r[i++] : 3 * i + n) + n] = 1;
                              this.dirty()
                            }
                          }
                        },
                        applyTransform: function (e) {
                          var t = this.attributes,
                            r = t.position.value,
                            i = t.normal.value,
                            n = t.tangent.value;
                          e = e.array;
                          var a = Ye.create();
                          Ye.invert(a, e), Ye.transpose(a, a);
                          var o = Qe.transformMat4,
                            s = Qe.forEach;
                          s(r, 3, 0, null, o, e), i && s(i, 3, 0, null, o, a), n && s(n, 4, 0, null, o, a), this.boundingBox && this.updateBoundingBox()
                        },
                        dispose: function (e) {
                          var t = this._cache;
                          t.use(e.__uid__);
                          var r = t.get("chunks");
                          if (r)
                            for (var i = 0; i < r.length; i++) {
                              for (var n = r[i], a = 0; a < n.attributeBuffers.length; a++) {
                                var o = n.attributeBuffers[a];
                                e.gl.deleteBuffer(o.buffer)
                              }
                              n.indicesBuffer && e.gl.deleteBuffer(n.indicesBuffer.buffer)
                            }
                          if (this.__vaoCache) {
                            var s = e.getGLExtension("OES_vertex_array_object");
                            for (var l in this.__vaoCache) {
                              var h = this.__vaoCache[l].vao;
                              h && s.deleteVertexArrayOES(h)
                            }
                          }
                          this.__vaoCache = {}, t.deleteContext(e.__uid__)
                        }
                      });
                    kr.STATIC_DRAW = Br.STATIC_DRAW, kr.DYNAMIC_DRAW = Br.DYNAMIC_DRAW, kr.STREAM_DRAW = Br.STREAM_DRAW, kr.AttributeBuffer = Br.AttributeBuffer, kr.IndicesBuffer = Br.IndicesBuffer, kr.Attribute = Ur;
                    const Vr = kr;
                    var Hr = "@export clay.header.",
                      Wr = "@end",
                      jr = ":unconfigurable;";
                    const Xr = [Hr + "directional_light", "uniform vec3 directionalLightDirection[DIRECTIONAL_LIGHT_COUNT]" + jr, "uniform vec3 directionalLightColor[DIRECTIONAL_LIGHT_COUNT]" + jr, Wr, Hr + "ambient_light", "uniform vec3 ambientLightColor[AMBIENT_LIGHT_COUNT]" + jr, Wr, Hr + "ambient_sh_light", "uniform vec3 ambientSHLightColor[AMBIENT_SH_LIGHT_COUNT]" + jr, "uniform vec3 ambientSHLightCoefficients[AMBIENT_SH_LIGHT_COUNT * 9]" + jr, "vec3 calcAmbientSHLight(int idx, vec3 N) {\n int offset = 9 * idx;\n return ambientSHLightCoefficients[0]\n + ambientSHLightCoefficients[1] * N.x\n + ambientSHLightCoefficients[2] * N.y\n + ambientSHLightCoefficients[3] * N.z\n + ambientSHLightCoefficients[4] * N.x * N.z\n + ambientSHLightCoefficients[5] * N.z * N.y\n + ambientSHLightCoefficients[6] * N.y * N.x\n + ambientSHLightCoefficients[7] * (3.0 * N.z * N.z - 1.0)\n + ambientSHLightCoefficients[8] * (N.x * N.x - N.y * N.y);\n}", Wr, Hr + "ambient_cubemap_light", "uniform vec3 ambientCubemapLightColor[AMBIENT_CUBEMAP_LIGHT_COUNT]" + jr, "uniform samplerCube ambientCubemapLightCubemap[AMBIENT_CUBEMAP_LIGHT_COUNT]" + jr, "uniform sampler2D ambientCubemapLightBRDFLookup[AMBIENT_CUBEMAP_LIGHT_COUNT]" + jr, Wr, Hr + "point_light", "uniform vec3 pointLightPosition[POINT_LIGHT_COUNT]" + jr, "uniform float pointLightRange[POINT_LIGHT_COUNT]" + jr, "uniform vec3 pointLightColor[POINT_LIGHT_COUNT]" + jr, Wr, Hr + "spot_light", "uniform vec3 spotLightPosition[SPOT_LIGHT_COUNT]" + jr, "uniform vec3 spotLightDirection[SPOT_LIGHT_COUNT]" + jr, "uniform float spotLightRange[SPOT_LIGHT_COUNT]" + jr, "uniform float spotLightUmbraAngleCosine[SPOT_LIGHT_COUNT]" + jr, "uniform float spotLightPenumbraAngleCosine[SPOT_LIGHT_COUNT]" + jr, "uniform float spotLightFalloffFactor[SPOT_LIGHT_COUNT]" + jr, "uniform vec3 spotLightColor[SPOT_LIGHT_COUNT]" + jr, Wr].join("\n");
                    Xe.import(Xr);
                    const qr = sr.extend((function () {
                      return {
                        color: [1, 1, 1],
                        intensity: 1,
                        castShadow: !0,
                        shadowResolution: 512,
                        group: 0
                      }
                    }), {
                      type: "",
                      clone: function () {
                        var e = sr.prototype.clone.call(this);
                        return e.color = Array.prototype.slice.call(this.color), e.intensity = this.intensity, e.castShadow = this.castShadow, e.shadowResolution = this.shadowResolution, e
                      }
                    });
                    var Zr, Yr, Kr, Qr, Jr = function (e, t) {
                      this.normal = e || new vt(0, 1, 0), this.distance = t || 0
                    };
                    Jr.prototype = {
                      constructor: Jr,
                      distanceToPoint: function (e) {
                        return Qe.dot(e.array, this.normal.array) - this.distance
                      },
                      projectPoint: function (e, t) {
                        t || (t = new vt);
                        var r = this.distanceToPoint(e);
                        return Qe.scaleAndAdd(t.array, e.array, this.normal.array, -r), t._dirty = !0, t
                      },
                      normalize: function () {
                        var e = 1 / Qe.len(this.normal.array);
                        Qe.scale(this.normal.array, e), this.distance *= e
                      },
                      intersectFrustum: function (e) {
                        for (var t = e.vertices, r = this.normal.array, i = Qe.dot(t[0].array, r) > this.distance, n = 1; n < 8; n++)
                          if (Qe.dot(t[n].array, r) > this.distance != i) return !0
                      },
                      intersectLine: (Qr = Qe.create(), function (e, t, r) {
                        var i = this.distanceToPoint(e),
                          n = this.distanceToPoint(t);
                        if (i > 0 && n > 0 || i < 0 && n < 0) return null;
                        var a = this.normal.array,
                          o = this.distance,
                          s = e.array;
                        Qe.sub(Qr, t.array, e.array), Qe.normalize(Qr, Qr);
                        var l = Qe.dot(a, Qr);
                        if (0 === l) return null;
                        r || (r = new vt);
                        var h = (Qe.dot(a, s) - o) / l;
                        return Qe.scaleAndAdd(r.array, s, Qr, -h), r._dirty = !0, r
                      }),
                      applyTransform: (Zr = Ye.create(), Yr = Et.create(), Kr = Et.create(), Kr[3] = 1, function (e) {
                        e = e.array, Qe.scale(Kr, this.normal.array, this.distance), Et.transformMat4(Kr, Kr, e), this.distance = Qe.dot(Kr, this.normal.array), Ye.invert(Zr, e), Ye.transpose(Zr, Zr), Yr[3] = 0, Qe.copy(Yr, this.normal.array), Et.transformMat4(Yr, Yr, Zr), Qe.copy(this.normal.array, Yr)
                      }),
                      copy: function (e) {
                        Qe.copy(this.normal.array, e.normal.array), this.normal._dirty = !0, this.distance = e.distance
                      },
                      clone: function () {
                        var e = new Jr;
                        return e.copy(this), e
                      }
                    };
                    const $r = Jr;
                    var ei, ti = Qe.set,
                      ri = Qe.copy,
                      ii = Qe.transformMat4,
                      ni = Math.min,
                      ai = Math.max,
                      oi = function () {
                        this.planes = [];
                        for (var e = 0; e < 6; e++) this.planes.push(new $r);
                        for (this.boundingBox = new ir, this.vertices = [], e = 0; e < 8; e++) this.vertices[e] = Qe.fromValues(0, 0, 0)
                      };
                    oi.prototype = {
                      setFromProjection: function (e) {
                        var t = this.planes,
                          r = e.array,
                          i = r[0],
                          n = r[1],
                          a = r[2],
                          o = r[3],
                          s = r[4],
                          l = r[5],
                          h = r[6],
                          u = r[7],
                          c = r[8],
                          d = r[9],
                          f = r[10],
                          p = r[11],
                          m = r[12],
                          g = r[13],
                          _ = r[14],
                          v = r[15];
                        ti(t[0].normal.array, o - i, u - s, p - c), t[0].distance = -(v - m), t[0].normalize(), ti(t[1].normal.array, o + i, u + s, p + c), t[1].distance = -(v + m), t[1].normalize(), ti(t[2].normal.array, o + n, u + l, p + d), t[2].distance = -(v + g), t[2].normalize(), ti(t[3].normal.array, o - n, u - l, p - d), t[3].distance = -(v - g), t[3].normalize(), ti(t[4].normal.array, o - a, u - h, p - f), t[4].distance = -(v - _), t[4].normalize(), ti(t[5].normal.array, o + a, u + h, p + f), t[5].distance = -(v + _), t[5].normalize();
                        var y = this.boundingBox,
                          x = this.vertices;
                        if (0 === v) {
                          var b = l / i,
                            w = -_ / (f - 1),
                            T = -_ / (f + 1),
                            S = -T / l,
                            M = -w / l;
                          y.min.set(-S * b, -S, T), y.max.set(S * b, S, w), ti(x[0], -S * b, -S, T), ti(x[1], -S * b, S, T), ti(x[2], S * b, -S, T), ti(x[3], S * b, S, T), ti(x[4], -M * b, -M, w), ti(x[5], -M * b, M, w), ti(x[6], M * b, -M, w), ti(x[7], M * b, M, w)
                        } else {
                          var A = (-1 - m) / i,
                            E = (1 - m) / i,
                            C = (1 - g) / l,
                            D = (-1 - g) / l,
                            L = (-1 - _) / f,
                            P = (1 - _) / f;
                          y.min.set(Math.min(A, E), Math.min(D, C), Math.min(P, L)), y.max.set(Math.max(E, A), Math.max(C, D), Math.max(L, P));
                          var O = y.min.array,
                            N = y.max.array;
                          ti(x[0], O[0], O[1], O[2]), ti(x[1], O[0], N[1], O[2]), ti(x[2], N[0], O[1], O[2]), ti(x[3], N[0], N[1], O[2]), ti(x[4], O[0], O[1], N[2]), ti(x[5], O[0], N[1], N[2]), ti(x[6], N[0], O[1], N[2]), ti(x[7], N[0], N[1], N[2])
                        }
                      },
                      getTransformedBoundingBox: (ei = Qe.create(), function (e, t) {
                        var r = this.vertices,
                          i = t.array,
                          n = e.min,
                          a = e.max,
                          o = n.array,
                          s = a.array,
                          l = r[0];
                        ii(ei, l, i), ri(o, ei), ri(s, ei);
                        for (var h = 1; h < 8; h++) l = r[h], ii(ei, l, i), o[0] = ni(ei[0], o[0]), o[1] = ni(ei[1], o[1]), o[2] = ni(ei[2], o[2]), s[0] = ai(ei[0], s[0]), s[1] = ai(ei[1], s[1]), s[2] = ai(ei[2], s[2]);
                        return n._dirty = !0, a._dirty = !0, e
                      })
                    };
                    const si = oi;
                    var li;
                    const hi = sr.extend((function () {
                      return {
                        projectionMatrix: new Ht,
                        invProjectionMatrix: new Ht,
                        viewMatrix: new Ht,
                        frustum: new si
                      }
                    }), (function () {
                      this.update(!0)
                    }), {
                      update: function (e) {
                        sr.prototype.update.call(this, e), Ht.invert(this.viewMatrix, this.worldTransform), this.updateProjectionMatrix(), Ht.invert(this.invProjectionMatrix, this.projectionMatrix), this.frustum.setFromProjection(this.projectionMatrix)
                      },
                      setViewMatrix: function (e) {
                        Ht.copy(this.viewMatrix, e), Ht.invert(this.worldTransform, e), this.decomposeWorldTransform()
                      },
                      decomposeProjectionMatrix: function () {},
                      setProjectionMatrix: function (e) {
                        Ht.copy(this.projectionMatrix, e), Ht.invert(this.invProjectionMatrix, e), this.decomposeProjectionMatrix()
                      },
                      updateProjectionMatrix: function () {},
                      castRay: (li = Et.create(), function (e, t) {
                        var r = void 0 !== t ? t : new Mt,
                          i = e.array[0],
                          n = e.array[1];
                        return Et.set(li, i, n, -1, 1), Et.transformMat4(li, li, this.invProjectionMatrix.array), Et.transformMat4(li, li, this.worldTransform.array), Qe.scale(r.origin.array, li, 1 / li[3]), Et.set(li, i, n, 1, 1), Et.transformMat4(li, li, this.invProjectionMatrix.array), Et.transformMat4(li, li, this.worldTransform.array), Qe.scale(li, li, 1 / li[3]), Qe.sub(r.direction.array, li, r.origin.array), Qe.normalize(r.direction.array, r.direction.array), r.direction._dirty = !0, r.origin._dirty = !0, r
                      })
                    });
                    var ui, ci, di = Ye.create(),
                      fi = Ye.create(),
                      pi = {};

                    function mi(e) {
                      var t = [],
                        r = Object.keys(e);
                      r.sort();
                      for (var i = 0; i < r.length; i++) {
                        var n = r[i];
                        t.push(n + " " + e[n])
                      }
                      var a = t.join("\n");
                      if (pi[a]) return pi[a];
                      var o = f.genGUID();
                      return pi[a] = o, o
                    }

                    function gi() {
                      this.opaque = [], this.transparent = [], this._opaqueCount = 0, this._transparentCount = 0
                    }

                    function _i(e, t) {
                      if (t.castShadow && !e.castShadow) return !0
                    }
                    gi.prototype.startCount = function () {
                      this._opaqueCount = 0, this._transparentCount = 0
                    }, gi.prototype.add = function (e, t) {
                      t ? this.transparent[this._transparentCount++] = e : this.opaque[this._opaqueCount++] = e
                    }, gi.prototype.endCount = function () {
                      this.transparent.length = this._transparentCount, this.opaque.length = this._opaqueCount
                    };
                    const vi = sr.extend((function () {
                      return {
                        material: null,
                        lights: [],
                        viewBoundingBoxLastFrame: new ir,
                        shadowUniforms: {},
                        _cameraList: [],
                        _lightUniforms: {},
                        _previousLightNumber: {},
                        _lightNumber: {},
                        _lightProgramKeys: {},
                        _nodeRepository: {},
                        _renderLists: new W(20)
                      }
                    }), (function () {
                      this._scene = this
                    }), {
                      addToScene: function (e) {
                        e instanceof hi ? (this._cameraList.length > 0 && console.warn("Found multiple camera in one scene. Use the fist one."), this._cameraList.push(e)) : e instanceof qr && this.lights.push(e), e.name && (this._nodeRepository[e.name] = e)
                      },
                      removeFromScene: function (e) {
                        var t;
                        e instanceof hi ? (t = this._cameraList.indexOf(e)) >= 0 && this._cameraList.splice(t, 1) : e instanceof qr && (t = this.lights.indexOf(e)) >= 0 && this.lights.splice(t, 1), e.name && delete this._nodeRepository[e.name]
                      },
                      getNode: function (e) {
                        return this._nodeRepository[e]
                      },
                      setMainCamera: function (e) {
                        var t = this._cameraList.indexOf(e);
                        t >= 0 && this._cameraList.splice(t, 1), this._cameraList.unshift(e)
                      },
                      getMainCamera: function () {
                        return this._cameraList[0]
                      },
                      getLights: function () {
                        return this.lights
                      },
                      updateLights: function () {
                        var e = this.lights;
                        this._previousLightNumber = this._lightNumber;
                        for (var t = {}, r = 0; r < e.length; r++) {
                          var i = e[r];
                          if (!i.invisible) {
                            var n = i.group;
                            t[n] || (t[n] = {}), t[n][i.type] = t[n][i.type] || 0, t[n][i.type]++
                          }
                        }
                        for (var a in this._lightNumber = t, t) this._lightProgramKeys[a] = mi(t[a]);
                        this._updateLightUniforms()
                      },
                      cloneNode: function (e) {
                        var t = e.clone(),
                          r = {};
                        return function e(t, i) {
                          r[t.__uid__] = i;
                          for (var n = 0; n < t._children.length; n++) e(t._children[n], i._children[n])
                        }(e, t), t.traverse((function (e) {
                          e.skeleton && (e.skeleton = e.skeleton.clone(r)), e.material && (e.material = e.material.clone())
                        })), t
                      },
                      updateRenderList: function (e, t) {
                        var r = e.__uid__,
                          i = this._renderLists.get(r);
                        i || (i = new gi, this._renderLists.put(r, i)), i.startCount(), t && (this.viewBoundingBoxLastFrame.min.set(1 / 0, 1 / 0, 1 / 0), this.viewBoundingBoxLastFrame.max.set(-1 / 0, -1 / 0, -1 / 0));
                        var n = this.material && this.material.transparent || !1;
                        return this._doUpdateRenderList(this, e, n, i, t), i.endCount(), i
                      },
                      getRenderList: function (e) {
                        return this._renderLists.get(e.__uid__)
                      },
                      _doUpdateRenderList: function (e, t, r, i, n) {
                        if (!e.invisible)
                          for (var a = 0; a < e._children.length; a++) {
                            var o = e._children[a];
                            if (o.isRenderable()) {
                              var s = o.isSkinnedMesh() ? di : o.worldTransform.array,
                                l = o.geometry;
                              Ye.multiplyAffine(fi, t.viewMatrix.array, s), (n && !l.boundingBox || !this.isFrustumCulled(o, t, fi)) && i.add(o, o.material.transparent || r)
                            }
                            o._children.length > 0 && this._doUpdateRenderList(o, t, r, i, n)
                          }
                      },
                      isFrustumCulled: (ui = new ir, ci = new Ht, function (e, t, r) {
                        var i = e.boundingBox;
                        if (i || (i = e.skeleton && e.skeleton.boundingBox ? e.skeleton.boundingBox : e.geometry.boundingBox), !i) return !1;
                        if (ci.array = r, ui.transformFrom(i, ci), e.castShadow && this.viewBoundingBoxLastFrame.union(ui), e.frustumCulling) {
                          if (!ui.intersectBoundingBox(t.frustum.boundingBox)) return !0;
                          ci.array = t.projectionMatrix.array, ui.max.array[2] > 0 && ui.min.array[2] < 0 && (ui.max.array[2] = -1e-20), ui.applyProjection(ci);
                          var n = ui.min.array,
                            a = ui.max.array;
                          if (a[0] < -1 || n[0] > 1 || a[1] < -1 || n[1] > 1 || a[2] < -1 || n[2] > 1) return !0
                        }
                        return !1
                      }),
                      _updateLightUniforms: function () {
                        var e = this.lights;
                        e.sort(_i);
                        var t = this._lightUniforms;
                        for (var r in t)
                          for (var i in t[r]) t[r][i].value.length = 0;
                        for (var n = 0; n < e.length; n++) {
                          var a = e[n];
                          if (!a.invisible)
                            for (var i in r = a.group, a.uniformTemplates) {
                              var o = a.uniformTemplates[i],
                                s = o.value(a);
                              if (null != s) {
                                t[r] || (t[r] = {}), t[r][i] || (t[r][i] = {
                                  type: "",
                                  value: []
                                });
                                var l = t[r][i];
                                switch (l.type = o.type + "v", o.type) {
                                  case "1i":
                                  case "1f":
                                  case "t":
                                    l.value.push(s);
                                    break;
                                  case "2f":
                                  case "3f":
                                  case "4f":
                                    for (var h = 0; h < s.length; h++) l.value.push(s[h]);
                                    break;
                                  default:
                                    console.error("Unkown light uniform type " + o.type)
                                }
                              }
                            }
                        }
                      },
                      getLightGroups: function () {
                        var e = [];
                        for (var t in this._lightNumber) e.push(t);
                        return e
                      },
                      getNumberChangedLightGroups: function () {
                        var e = [];
                        for (var t in this._lightNumber) this.isLightNumberChanged(t) && e.push(t);
                        return e
                      },
                      isLightNumberChanged: function (e) {
                        var t = this._previousLightNumber,
                          r = this._lightNumber;
                        for (var i in r[e]) {
                          if (!t[e]) return !0;
                          if (r[e][i] !== t[e][i]) return !0
                        }
                        for (var i in t[e]) {
                          if (!r[e]) return !0;
                          if (r[e][i] !== t[e][i]) return !0
                        }
                        return !1
                      },
                      getLightsNumbers: function (e) {
                        return this._lightNumber[e]
                      },
                      getProgramKey: function (e) {
                        return this._lightProgramKeys[e]
                      },
                      setLightUniforms: function () {
                        function e(e, t, r) {
                          for (var i in e) {
                            var n = e[i];
                            if ("tv" === n.type) {
                              if (!t.hasUniform(i)) continue;
                              for (var a = [], o = 0; o < n.value.length; o++) {
                                var s = n.value[o],
                                  l = t.takeCurrentTextureSlot(r, s);
                                a.push(l)
                              }
                              t.setUniform(r.gl, "1iv", i, a)
                            } else t.setUniform(r.gl, n.type, i, n.value)
                          }
                        }
                        return function (t, r, i) {
                          e(this._lightUniforms[r], t, i), e(this.shadowUniforms, t, i)
                        }
                      }(),
                      dispose: function () {
                        this.material = null, this._opaqueList = [], this._transparentList = [], this.lights = [], this._lightUniforms = {}, this._lightNumber = {}, this._nodeRepository = {}
                      }
                    });
                    var yi = function (e) {
                        this.value = e
                      },
                      xi = function () {
                        function e() {
                          this._len = 0
                        }
                        return e.prototype.insert = function (e) {
                          var t = new yi(e);
                          return this.insertEntry(t), t
                        }, e.prototype.insertEntry = function (e) {
                          this.head ? (this.tail.next = e, e.prev = this.tail, e.next = null, this.tail = e) : this.head = this.tail = e, this._len++
                        }, e.prototype.remove = function (e) {
                          var t = e.prev,
                            r = e.next;
                          t ? t.next = r : this.head = r, r ? r.prev = t : this.tail = t, e.next = e.prev = null, this._len--
                        }, e.prototype.len = function () {
                          return this._len
                        }, e.prototype.clear = function () {
                          this.head = this.tail = null, this._len = 0
                        }, e
                      }();
                    const bi = function () {
                      function e(e) {
                        this._list = new xi, this._maxSize = 10, this._map = {}, this._maxSize = e
                      }
                      return e.prototype.put = function (e, t) {
                        var r = this._list,
                          i = this._map,
                          n = null;
                        if (null == i[e]) {
                          var a = r.len(),
                            o = this._lastRemovedEntry;
                          if (a >= this._maxSize && a > 0) {
                            var s = r.head;
                            r.remove(s), delete i[s.key], n = s.value, this._lastRemovedEntry = s
                          }
                          o ? o.value = t : o = new yi(t), o.key = e, r.insertEntry(o), i[e] = o
                        }
                        return n
                      }, e.prototype.get = function (e) {
                        var t = this._map[e],
                          r = this._list;
                        if (null != t) return t !== r.tail && (r.remove(t), r.insertEntry(t)), t.value
                      }, e.prototype.clear = function () {
                        this._list.clear(), this._map = {}
                      }, e.prototype.len = function () {
                        return this._list.len()
                      }, e
                    }();
                    var wi = Mr.isPowerOfTwo,
                      Ti = ["px", "nx", "py", "ny", "pz", "nz"],
                      Si = wr.extend((function () {
                        return {
                          image: {
                            px: null,
                            nx: null,
                            py: null,
                            ny: null,
                            pz: null,
                            nz: null
                          },
                          pixels: {
                            px: null,
                            nx: null,
                            py: null,
                            ny: null,
                            pz: null,
                            nz: null
                          },
                          mipmaps: []
                        }
                      }), {
                        textureType: "textureCube",
                        update: function (e) {
                          var t = e.gl;
                          t.bindTexture(t.TEXTURE_CUBE_MAP, this._cache.get("webgl_texture")), this.updateCommon(e);
                          var r = this.format,
                            i = this.type;
                          t.texParameteri(t.TEXTURE_CUBE_MAP, t.TEXTURE_WRAP_S, this.getAvailableWrapS()), t.texParameteri(t.TEXTURE_CUBE_MAP, t.TEXTURE_WRAP_T, this.getAvailableWrapT()), t.texParameteri(t.TEXTURE_CUBE_MAP, t.TEXTURE_MAG_FILTER, this.getAvailableMagFilter()), t.texParameteri(t.TEXTURE_CUBE_MAP, t.TEXTURE_MIN_FILTER, this.getAvailableMinFilter());
                          var n = e.getGLExtension("EXT_texture_filter_anisotropic");
                          if (n && this.anisotropic > 1 && t.texParameterf(t.TEXTURE_CUBE_MAP, n.TEXTURE_MAX_ANISOTROPY_EXT, this.anisotropic), 36193 === i && (e.getGLExtension("OES_texture_half_float") || (i = S)), this.mipmaps.length)
                            for (var a = this.width, o = this.height, s = 0; s < this.mipmaps.length; s++) {
                              var l = this.mipmaps[s];
                              this._updateTextureData(t, l, s, a, o, r, i), a /= 2, o /= 2
                            } else this._updateTextureData(t, this, 0, this.width, this.height, r, i), !this.NPOT && this.useMipmap && t.generateMipmap(t.TEXTURE_CUBE_MAP);
                          t.bindTexture(t.TEXTURE_CUBE_MAP, null)
                        },
                        _updateTextureData: function (e, t, r, i, n, a, o) {
                          for (var s = 0; s < 6; s++) {
                            var l = Ti[s],
                              h = t.image && t.image[l];
                            h ? e.texImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X + s, r, a, a, o, h) : e.texImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X + s, r, a, i, n, 0, a, o, t.pixels && t.pixels[l])
                          }
                        },
                        generateMipmap: function (e) {
                          var t = e.gl;
                          this.useMipmap && !this.NPOT && (t.bindTexture(t.TEXTURE_CUBE_MAP, this._cache.get("webgl_texture")), t.generateMipmap(t.TEXTURE_CUBE_MAP))
                        },
                        bind: function (e) {
                          e.gl.bindTexture(e.gl.TEXTURE_CUBE_MAP, this.getWebGLTexture(e))
                        },
                        unbind: function (e) {
                          e.gl.bindTexture(e.gl.TEXTURE_CUBE_MAP, null)
                        },
                        isPowerOfTwo: function () {
                          return this.image.px ? wi(this.image.px.width) && wi(this.image.px.height) : wi(this.width) && wi(this.height)
                        },
                        isRenderable: function () {
                          return this.image.px ? Mi(this.image.px) && Mi(this.image.nx) && Mi(this.image.py) && Mi(this.image.ny) && Mi(this.image.pz) && Mi(this.image.nz) : !(!this.width || !this.height)
                        },
                        load: function (e, t) {
                          var r = 0,
                            i = this;
                          return f.each(e, (function (e, n) {
                            var a = U.createImage();
                            t && (a.crossOrigin = t), a.onload = function () {
                              0 == --r && (i.dirty(), i.trigger("success", i))
                            }, a.onerror = function () {
                              r--
                            }, r++, a.src = e, i.image[n] = a
                          })), this
                        }
                      });

                    function Mi(e) {
                      return e.width > 0 && e.height > 0
                    }
                    Object.defineProperty(Si.prototype, "width", {
                      get: function () {
                        return this.image && this.image.px ? this.image.px.width : this._width
                      },
                      set: function (e) {
                        this.image && this.image.px ? console.warn("Texture from image can't set width") : (this._width !== e && this.dirty(), this._width = e)
                      }
                    }), Object.defineProperty(Si.prototype, "height", {
                      get: function () {
                        return this.image && this.image.px ? this.image.px.height : this._height
                      },
                      set: function (e) {
                        this.image && this.image.px ? console.warn("Texture from image can't set height") : (this._height !== e && this.dirty(), this._height = e)
                      }
                    });
                    const Ai = Si,
                      Ei = hi.extend({
                        fov: 50,
                        aspect: 1,
                        near: .1,
                        far: 2e3
                      }, {
                        updateProjectionMatrix: function () {
                          var e = this.fov / 180 * Math.PI;
                          this.projectionMatrix.perspective(e, this.aspect, this.near, this.far)
                        },
                        decomposeProjectionMatrix: function () {
                          var e = this.projectionMatrix.array,
                            t = 2 * Math.atan(1 / e[5]);
                          this.fov = t / Math.PI * 180, this.aspect = e[5] / e[0], this.near = e[14] / (e[10] - 1), this.far = e[14] / (e[10] + 1)
                        },
                        clone: function () {
                          var e = hi.prototype.clone.call(this);
                          return e.fov = this.fov, e.aspect = this.aspect, e.near = this.near, e.far = this.far, e
                        }
                      });
                    var Ci = "framebuffer",
                      Di = "renderbuffer",
                      Li = "renderbuffer_width",
                      Pi = "renderbuffer_height",
                      Oi = "renderbuffer_attached",
                      Ni = "depthtexture_attached",
                      Ii = 36160,
                      Ri = 36161,
                      Bi = 36096,
                      Fi = m.extend({
                        depthBuffer: !0,
                        viewport: null,
                        _width: 0,
                        _height: 0,
                        _textures: null,
                        _boundRenderer: null
                      }, (function () {
                        this._cache = new xr, this._textures = {}
                      }), {
                        getTextureWidth: function () {
                          return this._width
                        },
                        getTextureHeight: function () {
                          return this._height
                        },
                        bind: function (e) {
                          if (e.__currentFrameBuffer) {
                            if (e.__currentFrameBuffer === this) return;
                            console.warn("Renderer already bound with another framebuffer. Unbind it first")
                          }
                          e.__currentFrameBuffer = this;
                          var t = e.gl;
                          t.bindFramebuffer(Ii, this._getFrameBufferGL(e)), this._boundRenderer = e;
                          var r = this._cache;
                          r.put("viewport", e.viewport);
                          var i, n, a = !1;
                          for (var o in this._textures) {
                            a = !0;
                            var s = this._textures[o];
                            s && (i = s.texture.width, n = s.texture.height, this._doAttach(e, s.texture, o, s.target))
                          }
                          this._width = i, this._height = n, !a && this.depthBuffer && console.error("Must attach texture before bind, or renderbuffer may have incorrect width and height."), this.viewport ? e.setViewport(this.viewport) : e.setViewport(0, 0, i, n, 1);
                          var l = r.get("attached_textures");
                          if (l)
                            for (var o in l)
                              if (!this._textures[o]) {
                                var h = l[o];
                                this._doDetach(t, o, h)
                              } if (!r.get(Ni) && this.depthBuffer) {
                            r.miss(Di) && r.put(Di, t.createRenderbuffer());
                            var u = r.get(Di);
                            i === r.get(Li) && n === r.get(Pi) || (t.bindRenderbuffer(Ri, u), t.renderbufferStorage(Ri, t.DEPTH_COMPONENT16, i, n), r.put(Li, i), r.put(Pi, n), t.bindRenderbuffer(Ri, null)), r.get(Oi) || (t.framebufferRenderbuffer(Ii, Bi, Ri, u), r.put(Oi, !0))
                          }
                        },
                        unbind: function (e) {
                          e.__currentFrameBuffer = null, e.gl.bindFramebuffer(Ii, null), this._boundRenderer = null, this._cache.use(e.__uid__);
                          var t = this._cache.get("viewport");
                          t && e.setViewport(t), this.updateMipmap(e)
                        },
                        updateMipmap: function (e) {
                          var t = e.gl;
                          for (var r in this._textures) {
                            var i = this._textures[r];
                            if (i) {
                              var n = i.texture;
                              if (!n.NPOT && n.useMipmap && n.minFilter === wr.LINEAR_MIPMAP_LINEAR) {
                                var a = "textureCube" === n.textureType ? 34067 : 3553;
                                t.bindTexture(a, n.getWebGLTexture(e)), t.generateMipmap(a), t.bindTexture(a, null)
                              }
                            }
                          }
                        },
                        checkStatus: function (e) {
                          return e.checkFramebufferStatus(Ii)
                        },
                        _getFrameBufferGL: function (e) {
                          var t = this._cache;
                          return t.use(e.__uid__), t.miss(Ci) && t.put(Ci, e.gl.createFramebuffer()), t.get(Ci)
                        },
                        attach: function (e, t, r) {
                          if (!e.width) throw new Error("The texture attached to color buffer is not a valid.");
                          t = t || 36064, r = r || 3553;
                          var i, n = this._boundRenderer;
                          if (n && n.gl) {
                            var a = this._cache;
                            a.use(n.__uid__), i = a.get("attached_textures")
                          }
                          var o = this._textures[t];
                          if (!o || o.target !== r || o.texture !== e || !i || null == i[t]) {
                            var s = !0;
                            n && (s = this._doAttach(n, e, t, r), this.viewport || n.setViewport(0, 0, e.width, e.height, 1)), s && (this._textures[t] = this._textures[t] || {}, this._textures[t].texture = e, this._textures[t].target = r)
                          }
                        },
                        _doAttach: function (e, t, r, i) {
                          var n = e.gl,
                            a = t.getWebGLTexture(e),
                            o = this._cache.get("attached_textures");
                          if (o && o[r]) {
                            var s = o[r];
                            if (s.texture === t && s.target === i) return
                          }
                          var l = !0;
                          if (((r = +r) === Bi || r === R) && (e.getGLExtension("WEBGL_depth_texture") || (console.error("Depth texture is not supported by the browser"), l = !1), t.format !== M && 34041 !== t.format && (console.error("The texture attached to depth buffer is not a valid."), l = !1), l)) {
                            var h = this._cache.get(Di);
                            h && (n.framebufferRenderbuffer(Ii, Bi, Ri, null), n.deleteRenderbuffer(h), this._cache.put(Di, !1)), this._cache.put(Oi, !1), this._cache.put(Ni, !0)
                          }
                          return n.framebufferTexture2D(Ii, r, i, a, 0), o || (o = {}, this._cache.put("attached_textures", o)), o[r] = o[r] || {}, o[r].texture = t, o[r].target = i, l
                        },
                        _doDetach: function (e, t, r) {
                          e.framebufferTexture2D(Ii, t, r, null, 0);
                          var i = this._cache.get("attached_textures");
                          i && i[t] && (i[t] = null), t !== Bi && t !== R || this._cache.put(Ni, !1)
                        },
                        detach: function (e, t) {
                          this._textures[e] = null, this._boundRenderer && (this._cache.use(this._boundRenderer.__uid__), this._doDetach(this._boundRenderer.gl, e, t))
                        },
                        dispose: function (e) {
                          var t = e.gl,
                            r = this._cache;
                          r.use(e.__uid__);
                          var i = r.get(Di);
                          i && t.deleteRenderbuffer(i);
                          var n = r.get(Ci);
                          n && t.deleteFramebuffer(n), r.deleteContext(e.__uid__), this._textures = {}
                        }
                      });
                    Fi.DEPTH_ATTACHMENT = Bi, Fi.COLOR_ATTACHMENT0 = 36064, Fi.STENCIL_ATTACHMENT = 36128, Fi.DEPTH_STENCIL_ATTACHMENT = R;
                    const zi = Fi;
                    var Gi = ["px", "nx", "py", "ny", "pz", "nz"];
                    const Ui = m.extend((function () {
                        var e = {
                            position: new vt,
                            far: 1e3,
                            near: .1,
                            texture: null,
                            shadowMapPass: null
                          },
                          t = e._cameras = {
                            px: new Ei({
                              fov: 90
                            }),
                            nx: new Ei({
                              fov: 90
                            }),
                            py: new Ei({
                              fov: 90
                            }),
                            ny: new Ei({
                              fov: 90
                            }),
                            pz: new Ei({
                              fov: 90
                            }),
                            nz: new Ei({
                              fov: 90
                            })
                          };
                        return t.px.lookAt(vt.POSITIVE_X, vt.NEGATIVE_Y), t.nx.lookAt(vt.NEGATIVE_X, vt.NEGATIVE_Y), t.py.lookAt(vt.POSITIVE_Y, vt.POSITIVE_Z), t.ny.lookAt(vt.NEGATIVE_Y, vt.NEGATIVE_Z), t.pz.lookAt(vt.POSITIVE_Z, vt.NEGATIVE_Y), t.nz.lookAt(vt.NEGATIVE_Z, vt.NEGATIVE_Y), e._frameBuffer = new zi, e
                      }), {
                        getCamera: function (e) {
                          return this._cameras[e]
                        },
                        render: function (e, t, r) {
                          var i = e.gl;
                          r || t.update();
                          for (var n = this.texture.width, a = 2 * Math.atan(n / (n - .5)) / Math.PI * 180, o = 0; o < 6; o++) {
                            var s = Gi[o],
                              l = this._cameras[s];
                            if (vt.copy(l.position, this.position), l.far = this.far, l.near = this.near, l.fov = a, this.shadowMapPass) {
                              l.update();
                              var h = t.getBoundingBox();
                              h.applyTransform(l.viewMatrix), t.viewBoundingBoxLastFrame.copy(h), this.shadowMapPass.render(e, t, l, !0)
                            }
                            this._frameBuffer.attach(this.texture, i.COLOR_ATTACHMENT0, i.TEXTURE_CUBE_MAP_POSITIVE_X + o), this._frameBuffer.bind(e), e.render(t, l, !0), this._frameBuffer.unbind(e)
                          }
                        },
                        dispose: function (e) {
                          this._frameBuffer.dispose(e)
                        }
                      }),
                      ki = Vr.extend({
                        dynamic: !1,
                        widthSegments: 1,
                        heightSegments: 1
                      }, (function () {
                        this.build()
                      }), {
                        build: function () {
                          for (var e = this.heightSegments, t = this.widthSegments, r = this.attributes, i = [], n = [], a = [], o = [], s = 0; s <= e; s++)
                            for (var l = s / e, h = 0; h <= t; h++) {
                              var u = h / t;
                              if (i.push([2 * u - 1, 2 * l - 1, 0]), n && n.push([u, l]), a && a.push([0, 0, 1]), h < t && s < e) {
                                var c = h + s * (t + 1);
                                o.push([c, c + 1, c + t + 1]), o.push([c + t + 1, c + 1, c + t + 2])
                              }
                            }
                          r.position.fromArray(i), r.texcoord0.fromArray(n), r.normal.fromArray(a), this.initIndicesFromArray(o), this.boundingBox = new ir, this.boundingBox.min.set(-1, -1, 0), this.boundingBox.max.set(1, 1, 0)
                        }
                      });
                    var Vi = new Ht;

                    function Hi(e, t, r) {
                      Vi.identity();
                      var i = new ki({
                        widthSegments: t,
                        heightSegments: r
                      });
                      switch (e) {
                        case "px":
                          Ht.translate(Vi, Vi, vt.POSITIVE_X), Ht.rotateY(Vi, Vi, Math.PI / 2);
                          break;
                        case "nx":
                          Ht.translate(Vi, Vi, vt.NEGATIVE_X), Ht.rotateY(Vi, Vi, -Math.PI / 2);
                          break;
                        case "py":
                          Ht.translate(Vi, Vi, vt.POSITIVE_Y), Ht.rotateX(Vi, Vi, -Math.PI / 2);
                          break;
                        case "ny":
                          Ht.translate(Vi, Vi, vt.NEGATIVE_Y), Ht.rotateX(Vi, Vi, Math.PI / 2);
                          break;
                        case "pz":
                          Ht.translate(Vi, Vi, vt.POSITIVE_Z);
                          break;
                        case "nz":
                          Ht.translate(Vi, Vi, vt.NEGATIVE_Z), Ht.rotateY(Vi, Vi, Math.PI)
                      }
                      return i.applyTransform(Vi), i
                    }
                    const Wi = Vr.extend({
                      dynamic: !1,
                      widthSegments: 1,
                      heightSegments: 1,
                      depthSegments: 1,
                      inside: !1
                    }, (function () {
                      this.build()
                    }), {
                      build: function () {
                        var e = {
                            px: Hi("px", this.depthSegments, this.heightSegments),
                            nx: Hi("nx", this.depthSegments, this.heightSegments),
                            py: Hi("py", this.widthSegments, this.depthSegments),
                            ny: Hi("ny", this.widthSegments, this.depthSegments),
                            pz: Hi("pz", this.widthSegments, this.heightSegments),
                            nz: Hi("nz", this.widthSegments, this.heightSegments)
                          },
                          t = ["position", "texcoord0", "normal"],
                          r = 0,
                          i = 0;
                        for (var n in e) r += e[n].vertexCount, i += e[n].indices.length;
                        for (var a = 0; a < t.length; a++) this.attributes[t[a]].init(r);
                        this.indices = new U.Uint16Array(i);
                        var o = 0,
                          s = 0;
                        for (var n in e) {
                          var l = e[n];
                          for (a = 0; a < t.length; a++)
                            for (var h = t[a], u = l.attributes[h].value, c = l.attributes[h].size, d = "normal" === h, f = 0; f < u.length; f++) {
                              var p = u[f];
                              this.inside && d && (p = -p), this.attributes[h].value[f + c * s] = p
                            }
                          var m = l.indices.length;
                          for (f = 0; f < l.indices.length; f++) this.indices[f + o] = s + l.indices[this.inside ? m - f - 1 : f];
                          o += l.indices.length, s += l.vertexCount
                        }
                        this.boundingBox = new ir, this.boundingBox.max.set(1, 1, 1), this.boundingBox.min.set(-1, -1, -1)
                      }
                    });
                    Xe.import("@export clay.skybox.vertex\n#define SHADER_NAME skybox\nuniform mat4 world : WORLD;\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\nattribute vec3 position : POSITION;\nvarying vec3 v_WorldPosition;\nvoid main()\n{\n v_WorldPosition = (world * vec4(position, 1.0)).xyz;\n gl_Position = worldViewProjection * vec4(position, 1.0);\n}\n@end\n@export clay.skybox.fragment\n#define PI 3.1415926\nuniform mat4 viewInverse : VIEWINVERSE;\n#ifdef EQUIRECTANGULAR\nuniform sampler2D environmentMap;\n#else\nuniform samplerCube environmentMap;\n#endif\nuniform float lod: 0.0;\nvarying vec3 v_WorldPosition;\n@import clay.util.rgbm\n@import clay.util.srgb\n@import clay.util.ACES\nvoid main()\n{\n vec3 eyePos = viewInverse[3].xyz;\n vec3 V = normalize(v_WorldPosition - eyePos);\n#ifdef EQUIRECTANGULAR\n float phi = acos(V.y);\n float theta = atan(-V.x, V.z) + PI * 0.5;\n vec2 uv = vec2(theta / 2.0 / PI, phi / PI);\n vec4 texel = decodeHDR(texture2D(environmentMap, fract(uv)));\n#else\n #if defined(LOD) || defined(SUPPORT_TEXTURE_LOD)\n vec4 texel = decodeHDR(textureCubeLodEXT(environmentMap, V, lod));\n #else\n vec4 texel = decodeHDR(textureCube(environmentMap, V));\n #endif\n#endif\n#ifdef SRGB_DECODE\n texel = sRGBToLinear(texel);\n#endif\n#ifdef TONEMAPPING\n texel.rgb = ACESToneMapping(texel.rgb);\n#endif\n#ifdef SRGB_ENCODE\n texel = linearTosRGB(texel);\n#endif\n gl_FragColor = encodeHDR(vec4(texel.rgb, 1.0));\n}\n@end");
                    const ji = Sr.extend((function () {
                        var e = new Xe({
                            vertex: Xe.source("clay.skybox.vertex"),
                            fragment: Xe.source("clay.skybox.fragment")
                          }),
                          t = new le({
                            shader: e,
                            depthMask: !1
                          });
                        return {
                          scene: null,
                          geometry: new Wi,
                          material: t,
                          environmentMap: null,
                          culling: !1,
                          _dummyCamera: new Ei
                        }
                      }), (function () {
                        var e = this.scene;
                        e && this.attachScene(e), this.environmentMap && this.setEnvironmentMap(this.environmentMap)
                      }), {
                        attachScene: function (e) {
                          this.scene && this.detachScene(), e.skybox = this, this.scene = e, e.on("beforerender", this._beforeRenderScene, this)
                        },
                        detachScene: function () {
                          this.scene && (this.scene.off("beforerender", this._beforeRenderScene), this.scene.skybox = null), this.scene = null
                        },
                        dispose: function (e) {
                          this.detachScene(), this.geometry.dispose(e)
                        },
                        setEnvironmentMap: function (e) {
                          "texture2D" === e.textureType ? (this.material.define("EQUIRECTANGULAR"), e.minFilter = wr.LINEAR) : this.material.undefine("EQUIRECTANGULAR"), this.material.set("environmentMap", e)
                        },
                        getEnvironmentMap: function () {
                          return this.material.get("environmentMap")
                        },
                        _beforeRenderScene: function (e, t, r) {
                          this.renderSkybox(e, r)
                        },
                        renderSkybox: function (e, t) {
                          var r = this._dummyCamera;
                          r.aspect = e.getViewportAspect(), r.fov = t.fov || 50, r.updateProjectionMatrix(), Ht.invert(r.invProjectionMatrix, r.projectionMatrix), r.worldTransform.copy(t.worldTransform), r.viewMatrix.copy(t.viewMatrix), this.position.copy(t.getWorldPosition()), this.update(), e.gl.disable(e.gl.BLEND), this.material.get("lod") > 0 ? this.material.define("fragment", "LOD") : this.material.undefine("fragment", "LOD"), e.renderPass([this], r)
                        }
                      }),
                      Xi = ji;

                    function qi(e) {
                      return e.charCodeAt(0) + (e.charCodeAt(1) << 8) + (e.charCodeAt(2) << 16) + (e.charCodeAt(3) << 24)
                    }
                    var Zi = qi("DXT1"),
                      Yi = qi("DXT3"),
                      Ki = qi("DXT5");
                    const Qi = function (e, t) {
                      var r = new Int32Array(e, 0, 31);
                      if (542327876 !== r[0]) return null;
                      if (4 & !r(20)) return null;
                      var i, n, a = r(21),
                        o = r[4],
                        s = r[3],
                        l = 512 & r[28],
                        h = 131072 & r[2];
                      switch (a) {
                        case Zi:
                          i = 8, n = wr.COMPRESSED_RGB_S3TC_DXT1_EXT;
                          break;
                        case Yi:
                          i = 16, n = wr.COMPRESSED_RGBA_S3TC_DXT3_EXT;
                          break;
                        case Ki:
                          i = 16, n = wr.COMPRESSED_RGBA_S3TC_DXT5_EXT;
                          break;
                        default:
                          return null
                      }
                      var u = r[1] + 4,
                        c = l ? 6 : 1,
                        d = 1;
                      h && (d = Math.max(1, r[7]));
                      for (var f = [], p = 0; p < c; p++) {
                        var m = o,
                          g = s;
                        f[p] = new Dr({
                          width: m,
                          height: g,
                          format: n
                        });
                        for (var _ = [], v = 0; v < d; v++) {
                          var y = Math.max(4, m) / 4 * Math.max(4, g) / 4 * i,
                            x = new Uint8Array(e, u, y);
                          u += y, m *= .5, g *= .5, _[v] = x
                        }
                        f[p].pixels = _[0], h && (f[p].mipmaps = _)
                      }
                      if (!t) return f[0];
                      t.width = f[0].width, t.height = f[0].height, t.format = f[0].format, t.pixels = f[0].pixels, t.mipmaps = f[0].mipmaps
                    };
                    var Ji = String.fromCharCode;

                    function $i(e, t, r, i) {
                      if (e[3] > 0) {
                        var n = Math.pow(2, e[3] - 128 - 8 + i);
                        t[r + 0] = e[0] * n, t[r + 1] = e[1] * n, t[r + 2] = e[2] * n
                      } else t[r + 0] = 0, t[r + 1] = 0, t[r + 2] = 0;
                      return t[r + 3] = 1, t
                    }

                    function en(e, t, r, i) {
                      for (var n, a, o = 0, s = 0, l = i; l > 0;)
                        if (e[s][0] = t[r++], e[s][1] = t[r++], e[s][2] = t[r++], e[s][3] = t[r++], 1 === e[s][0] && 1 === e[s][1] && 1 === e[s][2]) {
                          for (var h = e[s][3] << o >>> 0; h > 0; h--) n = e[s - 1], (a = e[s])[0] = n[0], a[1] = n[1], a[2] = n[2], a[3] = n[3], s++, l--;
                          o += 8
                        } else s++, l--, o = 0;
                      return r
                    }

                    function tn(e, t, r, i) {
                      if (i < 8 | i > 32767) return en(e, t, r, i);
                      if (2 != (n = t[r++])) return en(e, t, r - 1, i);
                      if (e[0][1] = t[r++], e[0][2] = t[r++], n = t[r++], (e[0][2] << 8 >>> 0 | n) >>> 0 !== i) return null;
                      for (var n = 0; n < 4; n++)
                        for (var a = 0; a < i;) {
                          var o = t[r++];
                          if (o > 128) {
                            o = (127 & o) >>> 0;
                            for (var s = t[r++]; o--;) e[a++][n] = s
                          } else
                            for (; o--;) e[a++][n] = t[r++]
                        }
                      return r
                    }
                    const rn = function (e, t, r) {
                      null == r && (r = 0);
                      var i = new Uint8Array(e),
                        n = i.length;
                      if ("#?" === function (e, t, r) {
                          for (var i = "", n = 0; n < 2; n++) i += Ji(e[n]);
                          return i
                        }(i)) {
                        for (var a = 2; a < n && ("\n" !== Ji(i[a]) || "\n" !== Ji(i[a + 1])); a++);
                        if (!(a >= n)) {
                          a += 2;
                          for (var o = ""; a < n; a++) {
                            var s = Ji(i[a]);
                            if ("\n" === s) break;
                            o += s
                          }
                          var l = o.split(" "),
                            h = parseInt(l[1]),
                            u = parseInt(l[3]);
                          if (u && h) {
                            for (var c = a + 1, d = [], f = 0; f < u; f++) {
                              d[f] = [];
                              for (var p = 0; p < 4; p++) d[f][p] = 0
                            }
                            for (var m = new Float32Array(u * h * 4), g = 0, _ = 0; _ < h; _++) {
                              if (!(c = tn(d, i, c, u))) return null;
                              for (f = 0; f < u; f++) $i(d[f], m, g, r), g += 4
                            }
                            return t || (t = new Dr), t.width = u, t.height = h, t.pixels = m, t.type = wr.FLOAT, t
                          }
                        }
                      }
                    };
                    var nn = {
                      loadTexture: function (e, t, r, i) {
                        var n;
                        if ("function" == typeof t ? (i = r = t, t = {}) : t = t || {}, "string" == typeof e) {
                          if (e.match(/.hdr$/) || "hdr" === t.fileType) return n = new Dr({
                            width: 0,
                            height: 0,
                            sRGB: !1
                          }), nn._fetchTexture(e, (function (e) {
                            rn(e, n, t.exposure), n.dirty(), r && r(n)
                          }), i), n;
                          e.match(/.dds$/) || "dds" === t.fileType ? (n = new Dr({
                            width: 0,
                            height: 0
                          }), nn._fetchTexture(e, (function (e) {
                            Qi(e, n), n.dirty(), r && r(n)
                          }), i)) : ((n = new Dr).load(e), n.success(r), n.error(i))
                        } else "object" == typeof e && void 0 !== e.px && ((n = new Ai).load(e), n.success(r), n.error(i));
                        return n
                      },
                      loadPanorama: function (e, t, r, i, n, a) {
                        var o = this;
                        "function" == typeof i ? (a = n = i, i = {}) : i = i || {}, nn.loadTexture(t, i, (function (t) {
                          t.flipY = i.flipY || !1, o.panoramaToCubeMap(e, t, r, i), t.dispose(e), n && n(r)
                        }), a)
                      },
                      panoramaToCubeMap: function (e, t, r, i) {
                        var n = new Ui,
                          a = new Xi({
                            scene: new vi
                          });
                        return a.setEnvironmentMap(t), (i = i || {}).encodeRGBM && a.material.define("fragment", "RGBM_ENCODE"), r.sRGB = t.sRGB, n.texture = r, n.render(e, a.scene), n.texture = null, n.dispose(e), r
                      },
                      heightToNormal: function (e, t) {
                        var r = document.createElement("canvas"),
                          i = r.width = e.width,
                          n = r.height = e.height,
                          a = r.getContext("2d");
                        a.drawImage(e, 0, 0, i, n), t = t || !1;
                        for (var o = a.getImageData(0, 0, i, n), s = a.createImageData(i, n), l = 0; l < o.data.length; l += 4) {
                          if (t) {
                            var h = o.data[l],
                              u = o.data[l + 1],
                              c = o.data[l + 2];
                            if (Math.abs(h - u) + Math.abs(u - c) > 20) return console.warn("Given image is not a height map"), e
                          }
                          var d, f, p, m;
                          l % (4 * i) == 0 ? (d = o.data[l], p = o.data[l + 4]) : l % (4 * i) == 4 * (i - 1) ? (d = o.data[l - 4], p = o.data[l]) : (d = o.data[l - 4], p = o.data[l + 4]), l < 4 * i ? (f = o.data[l], m = o.data[l + 4 * i]) : l > i * (n - 1) * 4 ? (f = o.data[l - 4 * i], m = o.data[l]) : (f = o.data[l - 4 * i], m = o.data[l + 4 * i]), s.data[l] = d - p + 127, s.data[l + 1] = f - m + 127, s.data[l + 2] = 255, s.data[l + 3] = 255
                        }
                        return a.putImageData(s, 0, 0), r
                      },
                      isHeightImage: function (e, t, r) {
                        if (!e || !e.width || !e.height) return !1;
                        var i = document.createElement("canvas"),
                          n = i.getContext("2d"),
                          a = t || 32;
                        r = r || 20, i.width = i.height = a, n.drawImage(e, 0, 0, a, a);
                        for (var o = n.getImageData(0, 0, a, a), s = 0; s < o.data.length; s += 4) {
                          var l = o.data[s],
                            h = o.data[s + 1],
                            u = o.data[s + 2];
                          if (Math.abs(l - h) + Math.abs(h - u) > r) return !1
                        }
                        return !0
                      },
                      _fetchTexture: function (e, t, r) {
                        U.request.get({
                          url: e,
                          responseType: "arraybuffer",
                          onload: t,
                          onerror: r
                        })
                      },
                      createChessboard: function (e, t, r, i) {
                        e = e || 512, t = t || 64, r = r || "black", i = i || "white";
                        var n = Math.ceil(e / t),
                          a = document.createElement("canvas");
                        a.width = e, a.height = e;
                        var o = a.getContext("2d");
                        o.fillStyle = i, o.fillRect(0, 0, e, e), o.fillStyle = r;
                        for (var s = 0; s < n; s++)
                          for (var l = 0; l < n; l++)(l % 2 ? s % 2 : s % 2 - 1) && o.fillRect(s * t, l * t, t, t);
                        return new Dr({
                          image: a,
                          anisotropic: 8
                        })
                      },
                      createBlank: function (e) {
                        var t = document.createElement("canvas");
                        t.width = 1, t.height = 1;
                        var r = t.getContext("2d");
                        return r.fillStyle = e, r.fillRect(0, 0, 1, 1), new Dr({
                          image: t
                        })
                      }
                    };
                    const an = nn;
                    var on = ["mousedown", "mouseup", "mousemove", "mouseover", "mouseout", "click", "dblclick", "contextmenu"];

                    function sn(e) {
                      return "_on" + e
                    }
                    var ln = function (e) {
                      var t = this;
                      this._texture = new Dr({
                        anisotropic: 32,
                        flipY: !1,
                        surface: this,
                        dispose: function (e) {
                          t.dispose(), Dr.prototype.dispose.call(this, e)
                        }
                      }), on.forEach((function (e) {
                        this[sn(e)] = function (t) {
                          t.triangle && this._meshes.forEach((function (r) {
                            this.dispatchEvent(e, r, t.triangle, t.point)
                          }), this)
                        }
                      }), this), this._meshes = [], e && this.setECharts(e), this.onupdate = null
                    };
                    ln.prototype = {
                      constructor: ln,
                      getTexture: function () {
                        return this._texture
                      },
                      setECharts: function (e) {
                        this._chart = e;
                        var t = e.getDom();
                        if (t instanceof HTMLCanvasElement) {
                          var r = this,
                            i = e.getZr(),
                            n = i.__oldRefreshImmediately || i.refreshImmediately;
                          i.refreshImmediately = function () {
                            n.call(this), r._texture.dirty(), r.onupdate && r.onupdate()
                          }, i.__oldRefreshImmediately = n
                        } else console.error("ECharts must init on canvas if it is used as texture."), t = document.createElement("canvas");
                        this._texture.image = t, this._texture.dirty(), this.onupdate && this.onupdate()
                      },
                      dispatchEvent: function () {
                        var e = new vt,
                          t = new vt,
                          r = new vt,
                          i = new _e,
                          n = new _e,
                          a = new _e,
                          o = new _e,
                          s = new vt;
                        return function (l, h, u, c) {
                          var d = h.geometry,
                            f = d.attributes.position,
                            p = d.attributes.texcoord0,
                            m = vt.dot,
                            g = vt.cross;
                          f.get(u[0], e.array), f.get(u[1], t.array), f.get(u[2], r.array), p.get(u[0], i.array), p.get(u[1], n.array), p.get(u[2], a.array), g(s, t, r);
                          var _ = m(e, s),
                            v = m(c, s) / _;
                          g(s, r, e);
                          var y = m(c, s) / _;
                          g(s, e, t);
                          var x = m(c, s) / _;
                          _e.scale(o, i, v), _e.scaleAndAdd(o, o, n, y), _e.scaleAndAdd(o, o, a, x);
                          var b = o.x * this._chart.getWidth(),
                            w = o.y * this._chart.getHeight();
                          this._chart.getZr().handler.dispatch(l, {
                            zrX: b,
                            zrY: w
                          })
                        }
                      }(),
                      attachToMesh: function (e) {
                        this._meshes.indexOf(e) >= 0 || (on.forEach((function (t) {
                          e.on(t, this[sn(t)], this)
                        }), this), this._meshes.push(e))
                      },
                      detachFromMesh: function (e) {
                        var t = this._meshes.indexOf(e);
                        t >= 0 && this._meshes.splice(t, 1), on.forEach((function (t) {
                          e.off(t, this[sn(t)])
                        }), this)
                      },
                      dispose: function () {
                        this._meshes.forEach((function (e) {
                          this.detachFromMesh(e)
                        }), this)
                      }
                    };
                    const hn = ln,
                      un = hi.extend({
                        left: -1,
                        right: 1,
                        near: -1,
                        far: 1,
                        top: 1,
                        bottom: -1
                      }, {
                        updateProjectionMatrix: function () {
                          this.projectionMatrix.ortho(this.left, this.right, this.bottom, this.top, this.near, this.far)
                        },
                        decomposeProjectionMatrix: function () {
                          var e = this.projectionMatrix.array;
                          this.left = (-1 - e[12]) / e[0], this.right = (1 - e[12]) / e[0], this.top = (1 - e[13]) / e[5], this.bottom = (-1 - e[13]) / e[5], this.near = -(-1 - e[14]) / e[10], this.far = -(1 - e[14]) / e[10]
                        },
                        clone: function () {
                          var e = hi.prototype.clone.call(this);
                          return e.left = this.left, e.right = this.right, e.near = this.near, e.far = this.far, e.top = this.top, e.bottom = this.bottom, e
                        }
                      });
                    Xe.import("\n@export clay.compositor.vertex\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\nattribute vec3 position : POSITION;\nattribute vec2 texcoord : TEXCOORD_0;\nvarying vec2 v_Texcoord;\nvoid main()\n{\n v_Texcoord = texcoord;\n gl_Position = worldViewProjection * vec4(position, 1.0);\n}\n@end");
                    var cn = new ki,
                      dn = new Sr({
                        geometry: cn,
                        frustumCulling: !1
                      }),
                      fn = new un;
                    const pn = m.extend((function () {
                      return {
                        fragment: "",
                        outputs: null,
                        material: null,
                        blendWithPrevious: !1,
                        clearColor: !1,
                        clearDepth: !0
                      }
                    }), (function () {
                      var e = new Xe(Xe.source("clay.compositor.vertex"), this.fragment),
                        t = new le({
                          shader: e
                        });
                      t.enableTexturesAll(), this.material = t
                    }), {
                      setUniform: function (e, t) {
                        this.material.setUniform(e, t)
                      },
                      getUniform: function (e) {
                        var t = this.material.uniforms[e];
                        if (t) return t.value
                      },
                      attachOutput: function (e, t) {
                        this.outputs || (this.outputs = {}), t = t || 36064, this.outputs[t] = e
                      },
                      detachOutput: function (e) {
                        for (var t in this.outputs) this.outputs[t] === e && (this.outputs[t] = null)
                      },
                      bind: function (e, t) {
                        if (this.outputs)
                          for (var r in this.outputs) {
                            var i = this.outputs[r];
                            i && t.attach(i, r)
                          }
                        t && t.bind(e)
                      },
                      unbind: function (e, t) {
                        t.unbind(e)
                      },
                      render: function (e, t) {
                        var r = e.gl;
                        if (t) {
                          this.bind(e, t);
                          var i = e.getGLExtension("EXT_draw_buffers");
                          if (i && this.outputs) {
                            var n = [];
                            for (var a in this.outputs)(a = +a) >= r.COLOR_ATTACHMENT0 && a <= r.COLOR_ATTACHMENT0 + 8 && n.push(a);
                            i.drawBuffersEXT(n)
                          }
                        }
                        this.trigger("beforerender", this, e);
                        var o = this.clearDepth ? r.DEPTH_BUFFER_BIT : 0;
                        if (r.depthMask(!0), this.clearColor) {
                          o |= r.COLOR_BUFFER_BIT, r.colorMask(!0, !0, !0, !0);
                          var s = this.clearColor;
                          Array.isArray(s) && r.clearColor(s[0], s[1], s[2], s[3])
                        }
                        r.clear(o), this.blendWithPrevious ? (r.enable(r.BLEND), this.material.transparent = !0) : (r.disable(r.BLEND), this.material.transparent = !1), this.renderQuad(e), this.trigger("afterrender", this, e), t && this.unbind(e, t)
                      },
                      renderQuad: function (e) {
                        dn.material = this.material, e.renderPass([dn], fn)
                      },
                      dispose: function (e) {}
                    });
                    var mn = {},
                      gn = ["px", "nx", "py", "ny", "pz", "nz"];
                    mn.prefilterEnvironmentMap = function (e, t, r, i, n) {
                      n && i || (i = mn.generateNormalDistribution(), n = mn.integrateBRDF(e, i));
                      var a = (r = r || {}).width || 64,
                        o = r.height || 64,
                        s = r.type || t.type,
                        l = new Ai({
                          width: a,
                          height: o,
                          type: s,
                          flipY: !1,
                          mipmaps: []
                        });
                      l.isPowerOfTwo() || console.warn("Width and height must be power of two to enable mipmap.");
                      var h = Math.min(a, o),
                        u = Math.log(h) / Math.log(2) + 1,
                        c = new le({
                          shader: new Xe({
                            vertex: Xe.source("clay.skybox.vertex"),
                            fragment: "#define SHADER_NAME prefilter\n#define SAMPLE_NUMBER 1024\n#define PI 3.14159265358979\nuniform mat4 viewInverse : VIEWINVERSE;\nuniform samplerCube environmentMap;\nuniform sampler2D normalDistribution;\nuniform float roughness : 0.5;\nvarying vec2 v_Texcoord;\nvarying vec3 v_WorldPosition;\n@import clay.util.rgbm\nvec3 importanceSampleNormal(float i, float roughness, vec3 N) {\n vec3 H = texture2D(normalDistribution, vec2(roughness, i)).rgb;\n vec3 upVector = abs(N.y) > 0.999 ? vec3(1.0, 0.0, 0.0) : vec3(0.0, 1.0, 0.0);\n vec3 tangentX = normalize(cross(N, upVector));\n vec3 tangentZ = cross(N, tangentX);\n return normalize(tangentX * H.x + N * H.y + tangentZ * H.z);\n}\nvoid main() {\n vec3 eyePos = viewInverse[3].xyz;\n vec3 V = normalize(v_WorldPosition - eyePos);\n vec3 N = V;\n vec3 prefilteredColor = vec3(0.0);\n float totalWeight = 0.0;\n float fMaxSampleNumber = float(SAMPLE_NUMBER);\n for (int i = 0; i < SAMPLE_NUMBER; i++) {\n vec3 H = importanceSampleNormal(float(i) / fMaxSampleNumber, roughness, N);\n vec3 L = reflect(-V, H);\n float NoL = clamp(dot(N, L), 0.0, 1.0);\n if (NoL > 0.0) {\n prefilteredColor += decodeHDR(textureCube(environmentMap, L)).rgb * NoL;\n totalWeight += NoL;\n }\n }\n gl_FragColor = encodeHDR(vec4(prefilteredColor / totalWeight, 1.0));\n}\n"
                          })
                        });
                      c.set("normalDistribution", i), r.encodeRGBM && c.define("fragment", "RGBM_ENCODE"), r.decodeRGBM && c.define("fragment", "RGBM_DECODE");
                      var d, f = new vi;
                      if ("texture2D" === t.textureType) {
                        var p = new Ai({
                          width: a,
                          height: o,
                          type: s === wr.FLOAT ? wr.HALF_FLOAT : s
                        });
                        an.panoramaToCubeMap(e, t, p, {
                          encodeRGBM: r.decodeRGBM
                        }), t = p
                      }(d = new ji({
                        scene: f,
                        material: c
                      })).material.set("environmentMap", t);
                      var m = new Ui({
                        texture: l
                      });
                      r.encodeRGBM && (s = l.type = wr.UNSIGNED_BYTE);
                      for (var g = new Dr({
                          width: a,
                          height: o,
                          type: s
                        }), _ = new zi({
                          depthBuffer: !1
                        }), v = U[s === wr.UNSIGNED_BYTE ? "Uint8Array" : "Float32Array"], y = 0; y < u; y++) {
                        l.mipmaps[y] = {
                          pixels: {}
                        }, d.material.set("roughness", y / (u - 1));
                        for (var x = g.width, b = 2 * Math.atan(x / (x - .5)) / Math.PI * 180, w = 0; w < gn.length; w++) {
                          var T = new v(g.width * g.height * 4);
                          _.attach(g), _.bind(e);
                          var S = m.getCamera(gn[w]);
                          S.fov = b, e.render(f, S), e.gl.readPixels(0, 0, g.width, g.height, wr.RGBA, s, T), _.unbind(e), l.mipmaps[y].pixels[gn[w]] = T
                        }
                        g.width /= 2, g.height /= 2, g.dirty()
                      }
                      return _.dispose(e), g.dispose(e), d.dispose(e), i.dispose(e), {
                        environmentMap: l,
                        brdfLookup: n,
                        normalDistribution: i,
                        maxMipmapLevel: u
                      }
                    }, mn.integrateBRDF = function (e, t) {
                      t = t || mn.generateNormalDistribution();
                      var r = new zi({
                          depthBuffer: !1
                        }),
                        i = new pn({
                          fragment: "#define SAMPLE_NUMBER 1024\n#define PI 3.14159265358979\nuniform sampler2D normalDistribution;\nuniform vec2 viewportSize : [512, 256];\nconst vec3 N = vec3(0.0, 0.0, 1.0);\nconst float fSampleNumber = float(SAMPLE_NUMBER);\nvec3 importanceSampleNormal(float i, float roughness, vec3 N) {\n vec3 H = texture2D(normalDistribution, vec2(roughness, i)).rgb;\n vec3 upVector = abs(N.y) > 0.999 ? vec3(1.0, 0.0, 0.0) : vec3(0.0, 1.0, 0.0);\n vec3 tangentX = normalize(cross(N, upVector));\n vec3 tangentZ = cross(N, tangentX);\n return normalize(tangentX * H.x + N * H.y + tangentZ * H.z);\n}\nfloat G_Smith(float roughness, float NoV, float NoL) {\n float k = roughness * roughness / 2.0;\n float G1V = NoV / (NoV * (1.0 - k) + k);\n float G1L = NoL / (NoL * (1.0 - k) + k);\n return G1L * G1V;\n}\nvoid main() {\n vec2 uv = gl_FragCoord.xy / viewportSize;\n float NoV = uv.x;\n float roughness = uv.y;\n vec3 V;\n V.x = sqrt(1.0 - NoV * NoV);\n V.y = 0.0;\n V.z = NoV;\n float A = 0.0;\n float B = 0.0;\n for (int i = 0; i < SAMPLE_NUMBER; i++) {\n vec3 H = importanceSampleNormal(float(i) / fSampleNumber, roughness, N);\n vec3 L = reflect(-V, H);\n float NoL = clamp(L.z, 0.0, 1.0);\n float NoH = clamp(H.z, 0.0, 1.0);\n float VoH = clamp(dot(V, H), 0.0, 1.0);\n if (NoL > 0.0) {\n float G = G_Smith(roughness, NoV, NoL);\n float G_Vis = G * VoH / (NoH * NoV);\n float Fc = pow(1.0 - VoH, 5.0);\n A += (1.0 - Fc) * G_Vis;\n B += Fc * G_Vis;\n }\n }\n gl_FragColor = vec4(vec2(A, B) / fSampleNumber, 0.0, 1.0);\n}\n"
                        }),
                        n = new Dr({
                          width: 512,
                          height: 256,
                          type: wr.HALF_FLOAT,
                          wrapS: wr.CLAMP_TO_EDGE,
                          wrapT: wr.CLAMP_TO_EDGE,
                          minFilter: wr.NEAREST,
                          magFilter: wr.NEAREST,
                          useMipmap: !1
                        });
                      return i.setUniform("normalDistribution", t), i.setUniform("viewportSize", [512, 256]), i.attachOutput(n), i.render(e, r), r.dispose(e), n
                    }, mn.generateNormalDistribution = function (e, t) {
                      for (var r = new Dr({
                          width: e = e || 256,
                          height: t = t || 1024,
                          type: wr.FLOAT,
                          minFilter: wr.NEAREST,
                          magFilter: wr.NEAREST,
                          wrapS: wr.CLAMP_TO_EDGE,
                          wrapT: wr.CLAMP_TO_EDGE,
                          useMipmap: !1
                        }), i = new Float32Array(t * e * 4), n = [], a = 0; a < e; a++) {
                        for (var o = a / e, s = o * o, l = 0; l < t; l++) {
                          var h = (l << 16 | l >>> 16) >>> 0;
                          h = (((16711935 & (h = ((252645135 & (h = ((858993459 & (h = ((1431655765 & h) << 1 | (2863311530 & h) >>> 1) >>> 0)) << 2 | (3435973836 & h) >>> 2) >>> 0)) << 4 | (4042322160 & h) >>> 4) >>> 0)) << 8 | (4278255360 & h) >>> 8) >>> 0) / 4294967296;
                          var u = Math.sqrt((1 - h) / (1 + (s * s - 1) * h));
                          n[l] = u
                        }
                        for (l = 0; l < t; l++) {
                          var c = 4 * (l * e + a),
                            d = (u = n[l], Math.sqrt(1 - u * u)),
                            f = l / t,
                            p = 2 * Math.PI * f;
                          i[c] = d * Math.cos(p), i[c + 1] = u, i[c + 2] = d * Math.sin(p), i[c + 3] = 1
                        }
                      }
                      return r.pixels = i, r
                    };
                    const _n = mn,
                      vn = qr.extend({
                        cubemap: null,
                        castShadow: !1,
                        _normalDistribution: null,
                        _brdfLookup: null
                      }, {
                        type: "AMBIENT_CUBEMAP_LIGHT",
                        prefilter: function (e, t) {
                          if (e.getGLExtension("EXT_shader_texture_lod")) {
                            this._brdfLookup || (this._normalDistribution = _n.generateNormalDistribution(), this._brdfLookup = _n.integrateBRDF(e, this._normalDistribution));
                            var r = this.cubemap;
                            if (!r.__prefiltered) {
                              var i = _n.prefilterEnvironmentMap(e, r, {
                                encodeRGBM: !0,
                                width: t,
                                height: t
                              }, this._normalDistribution, this._brdfLookup);
                              this.cubemap = i.environmentMap, this.cubemap.__prefiltered = !0, r.dispose(e)
                            }
                          } else console.warn("Device not support textureCubeLodEXT")
                        },
                        getBRDFLookup: function () {
                          return this._brdfLookup
                        },
                        uniformTemplates: {
                          ambientCubemapLightColor: {
                            type: "3f",
                            value: function (e) {
                              var t = e.color,
                                r = e.intensity;
                              return [t[0] * r, t[1] * r, t[2] * r]
                            }
                          },
                          ambientCubemapLightCubemap: {
                            type: "t",
                            value: function (e) {
                              return e.cubemap
                            }
                          },
                          ambientCubemapLightBRDFLookup: {
                            type: "t",
                            value: function (e) {
                              return e._brdfLookup
                            }
                          }
                        }
                      }),
                      yn = qr.extend({
                        castShadow: !1,
                        coefficients: []
                      }, (function () {
                        this._coefficientsTmpArr = new U.Float32Array(27)
                      }), {
                        type: "AMBIENT_SH_LIGHT",
                        uniformTemplates: {
                          ambientSHLightColor: {
                            type: "3f",
                            value: function (e) {
                              var t = e.color,
                                r = e.intensity;
                              return [t[0] * r, t[1] * r, t[2] * r]
                            }
                          },
                          ambientSHLightCoefficients: {
                            type: "3f",
                            value: function (e) {
                              for (var t = e._coefficientsTmpArr, r = 0; r < e.coefficients.length; r++) t[r] = e.coefficients[r];
                              return t
                            }
                          }
                        }
                      });
                    var xn = {},
                      bn = ["px", "nx", "py", "ny", "pz", "nz"];

                    function wn(e, t) {
                      var r = e[0],
                        i = e[1],
                        n = e[2];
                      return 0 === t ? 1 : 1 === t ? r : 2 === t ? i : 3 === t ? n : 4 === t ? r * n : 5 === t ? i * n : 6 === t ? r * i : 7 === t ? 3 * n * n - 1 : r * r - i * i
                    }
                    var Tn = {
                      px: [2, 1, 0, -1, -1, 1],
                      nx: [2, 1, 0, 1, -1, -1],
                      py: [0, 2, 1, 1, -1, -1],
                      ny: [0, 2, 1, 1, 1, 1],
                      pz: [0, 1, 2, -1, -1, -1],
                      nz: [0, 1, 2, 1, -1, 1]
                    };
                    xn.projectEnvironmentMap = function (e, t, r) {
                      var i;
                      (r = r || {}).lod = r.lod || 0;
                      var n = new vi,
                        a = 64;
                      "texture2D" === t.textureType ? i = new Xi({
                        scene: n,
                        environmentMap: t
                      }) : (a = t.image && t.image.px ? t.image.px.width : t.width, i = new ji({
                        scene: n,
                        environmentMap: t
                      }));
                      var o = Math.ceil(a / Math.pow(2, r.lod)),
                        s = Math.ceil(a / Math.pow(2, r.lod)),
                        l = new Dr({
                          width: o,
                          height: s
                        }),
                        h = new zi;
                      i.material.define("fragment", "RGBM_ENCODE"), r.decodeRGBM && i.material.define("fragment", "RGBM_DECODE"), i.material.set("lod", r.lod);
                      for (var u = new Ui({
                          texture: l
                        }), c = {}, d = 0; d < bn.length; d++) {
                        c[bn[d]] = new Uint8Array(o * s * 4);
                        var f = u.getCamera(bn[d]);
                        f.fov = 90, h.attach(l), h.bind(e), e.render(n, f), e.gl.readPixels(0, 0, o, s, wr.RGBA, wr.UNSIGNED_BYTE, c[bn[d]]), h.unbind(e)
                      }
                      return i.dispose(e), h.dispose(e), l.dispose(e),
                        function (e, t, r, i) {
                          for (var n = new U.Float32Array(27), a = Qe.create(), o = Qe.create(), s = Qe.create(), l = 0; l < 9; l++) {
                            for (var h = Qe.create(), u = 0; u < bn.length; u++) {
                              for (var c = t[bn[u]], d = Qe.create(), f = 0, p = 0, m = Tn[bn[u]], g = 0; g < i; g++)
                                for (var _ = 0; _ < r; _++) {
                                  a[0] = _ / (r - 1) * 2 - 1, a[1] = g / (i - 1) * 2 - 1, a[2] = -1, Qe.normalize(a, a), s[0] = a[m[0]] * m[3], s[1] = a[m[1]] * m[4], s[2] = a[m[2]] * m[5], o[0] = c[p++] / 255, o[1] = c[p++] / 255, o[2] = c[p++] / 255;
                                  var v = c[p++] / 255 * 8.12;
                                  o[0] *= v, o[1] *= v, o[2] *= v, Qe.scaleAndAdd(d, d, o, wn(s, l) * -a[2]), f += -a[2]
                                }
                              Qe.scaleAndAdd(h, h, d, 1 / f)
                            }
                            n[3 * l] = h[0] / 6, n[3 * l + 1] = h[1] / 6, n[3 * l + 2] = h[2] / 6
                          }
                          return n
                        }(0, c, o, s)
                    };
                    const Sn = xn,
                      Mn = function () {
                        for (var e = 0, t = arguments.length; e < t; e++)
                          if (null != arguments[e]) return arguments[e]
                      },
                      An = function (e, t) {
                        return null != t.dataIndexInside ? t.dataIndexInside : null != t.dataIndex ? i.util.isArray(t.dataIndex) ? i.util.map(t.dataIndex, (function (t) {
                          return e.indexOfRawIndex(t)
                        })) : e.indexOfRawIndex(t.dataIndex) : null != t.name ? i.util.isArray(t.name) ? i.util.map(t.name, (function (t) {
                          return e.indexOfName(t)
                        })) : e.indexOfName(t.name) : void 0
                      },
                      En = Vr.extend({
                        dynamic: !1,
                        widthSegments: 40,
                        heightSegments: 20,
                        phiStart: 0,
                        phiLength: 2 * Math.PI,
                        thetaStart: 0,
                        thetaLength: Math.PI,
                        radius: 1
                      }, (function () {
                        this.build()
                      }), {
                        build: function () {
                          var e = this.heightSegments,
                            t = this.widthSegments,
                            r = this.attributes.position,
                            i = this.attributes.texcoord0,
                            n = this.attributes.normal,
                            a = (t + 1) * (e + 1);
                          r.init(a), i.init(a), n.init(a);
                          var o, s, l, h, u, c, d, f, p, m, g, _ = a > 65535 ? Uint32Array : Uint16Array,
                            v = this.indices = new _(t * e * 6),
                            y = this.radius,
                            x = this.phiStart,
                            b = this.phiLength,
                            w = this.thetaStart,
                            T = this.thetaLength,
                            S = [],
                            M = [],
                            A = 0,
                            E = 1 / (y = this.radius);
                          for (d = 0; d <= e; d++)
                            for (c = 0; c <= t; c++) h = c / t, u = d / e, o = -y * Math.cos(x + h * b) * Math.sin(w + u * T), s = y * Math.cos(w + u * T), l = y * Math.sin(x + h * b) * Math.sin(w + u * T), S[0] = o, S[1] = s, S[2] = l, M[0] = h, M[1] = u, r.set(A, S), i.set(A, M), S[0] *= E, S[1] *= E, S[2] *= E, n.set(A, S), A++;
                          var C = t + 1,
                            D = 0;
                          for (d = 0; d < e; d++)
                            for (c = 0; c < t; c++) p = d * C + c, f = d * C + c + 1, g = (d + 1) * C + c + 1, m = (d + 1) * C + c, v[D++] = f, v[D++] = p, v[D++] = g, v[D++] = p, v[D++] = m, v[D++] = g;
                          this.boundingBox = new ir, this.boundingBox.max.set(y, y, y), this.boundingBox.min.set(-y, -y, -y)
                        }
                      }),
                      Cn = qr.extend({
                        castShadow: !1
                      }, {
                        type: "AMBIENT_LIGHT",
                        uniformTemplates: {
                          ambientLightColor: {
                            type: "3f",
                            value: function (e) {
                              var t = e.color,
                                r = e.intensity;
                              return [t[0] * r, t[1] * r, t[2] * r]
                            }
                          }
                        }
                      }),
                      Dn = qr.extend({
                        shadowBias: .001,
                        shadowSlopeScale: 2,
                        shadowCascade: 1,
                        cascadeSplitLogFactor: .2
                      }, {
                        type: "DIRECTIONAL_LIGHT",
                        uniformTemplates: {
                          directionalLightDirection: {
                            type: "3f",
                            value: function (e) {
                              return e.__dir = e.__dir || new vt, e.__dir.copy(e.worldTransform.z).normalize().negate().array
                            }
                          },
                          directionalLightColor: {
                            type: "3f",
                            value: function (e) {
                              var t = e.color,
                                r = e.intensity;
                              return [t[0] * r, t[1] * r, t[2] * r]
                            }
                          }
                        },
                        clone: function () {
                          var e = qr.prototype.clone.call(this);
                          return e.shadowBias = this.shadowBias, e.shadowSlopeScale = this.shadowSlopeScale, e
                        }
                      }),
                      Ln = qr.extend({
                        range: 100,
                        castShadow: !1
                      }, {
                        type: "POINT_LIGHT",
                        uniformTemplates: {
                          pointLightPosition: {
                            type: "3f",
                            value: function (e) {
                              return e.getWorldPosition().array
                            }
                          },
                          pointLightRange: {
                            type: "1f",
                            value: function (e) {
                              return e.range
                            }
                          },
                          pointLightColor: {
                            type: "3f",
                            value: function (e) {
                              var t = e.color,
                                r = e.intensity;
                              return [t[0] * r, t[1] * r, t[2] * r]
                            }
                          }
                        },
                        clone: function () {
                          var e = qr.prototype.clone.call(this);
                          return e.range = this.range, e
                        }
                      }),
                      Pn = qr.extend({
                        range: 20,
                        umbraAngle: 30,
                        penumbraAngle: 45,
                        falloffFactor: 2,
                        shadowBias: .001,
                        shadowSlopeScale: 2
                      }, {
                        type: "SPOT_LIGHT",
                        uniformTemplates: {
                          spotLightPosition: {
                            type: "3f",
                            value: function (e) {
                              return e.getWorldPosition().array
                            }
                          },
                          spotLightRange: {
                            type: "1f",
                            value: function (e) {
                              return e.range
                            }
                          },
                          spotLightUmbraAngleCosine: {
                            type: "1f",
                            value: function (e) {
                              return Math.cos(e.umbraAngle * Math.PI / 180)
                            }
                          },
                          spotLightPenumbraAngleCosine: {
                            type: "1f",
                            value: function (e) {
                              return Math.cos(e.penumbraAngle * Math.PI / 180)
                            }
                          },
                          spotLightFalloffFactor: {
                            type: "1f",
                            value: function (e) {
                              return e.falloffFactor
                            }
                          },
                          spotLightDirection: {
                            type: "3f",
                            value: function (e) {
                              return e.__dir = e.__dir || new vt, e.__dir.copy(e.worldTransform.z).negate().array
                            }
                          },
                          spotLightColor: {
                            type: "3f",
                            value: function (e) {
                              var t = e.color,
                                r = e.intensity;
                              return [t[0] * r, t[1] * r, t[2] * r]
                            }
                          }
                        },
                        clone: function () {
                          var e = qr.prototype.clone.call(this);
                          return e.range = this.range, e.umbraAngle = this.umbraAngle, e.penumbraAngle = this.penumbraAngle, e.falloffFactor = this.falloffFactor, e.shadowBias = this.shadowBias, e.shadowSlopeScale = this.shadowSlopeScale, e
                        }
                      });
                    var On = function (e, t, r, i) {
                      e = e || 0, t = t || 0, r = r || 0, i = i || 0, this.array = Et.fromValues(e, t, r, i), this._dirty = !0
                    };
                    On.prototype = {
                      constructor: On,
                      add: function (e) {
                        return Et.add(this.array, this.array, e.array), this._dirty = !0, this
                      },
                      set: function (e, t, r, i) {
                        return this.array[0] = e, this.array[1] = t, this.array[2] = r, this.array[3] = i, this._dirty = !0, this
                      },
                      setArray: function (e) {
                        return this.array[0] = e[0], this.array[1] = e[1], this.array[2] = e[2], this.array[3] = e[3], this._dirty = !0, this
                      },
                      clone: function () {
                        return new On(this.x, this.y, this.z, this.w)
                      },
                      copy: function (e) {
                        return Et.copy(this.array, e.array), this._dirty = !0, this
                      },
                      dist: function (e) {
                        return Et.dist(this.array, e.array)
                      },
                      distance: function (e) {
                        return Et.distance(this.array, e.array)
                      },
                      div: function (e) {
                        return Et.div(this.array, this.array, e.array), this._dirty = !0, this
                      },
                      divide: function (e) {
                        return Et.divide(this.array, this.array, e.array), this._dirty = !0, this
                      },
                      dot: function (e) {
                        return Et.dot(this.array, e.array)
                      },
                      len: function () {
                        return Et.len(this.array)
                      },
                      length: function () {
                        return Et.length(this.array)
                      },
                      lerp: function (e, t, r) {
                        return Et.lerp(this.array, e.array, t.array, r), this._dirty = !0, this
                      },
                      min: function (e) {
                        return Et.min(this.array, this.array, e.array), this._dirty = !0, this
                      },
                      max: function (e) {
                        return Et.max(this.array, this.array, e.array), this._dirty = !0, this
                      },
                      mul: function (e) {
                        return Et.mul(this.array, this.array, e.array), this._dirty = !0, this
                      },
                      multiply: function (e) {
                        return Et.multiply(this.array, this.array, e.array), this._dirty = !0, this
                      },
                      negate: function () {
                        return Et.negate(this.array, this.array), this._dirty = !0, this
                      },
                      normalize: function () {
                        return Et.normalize(this.array, this.array), this._dirty = !0, this
                      },
                      random: function (e) {
                        return Et.random(this.array, e), this._dirty = !0, this
                      },
                      scale: function (e) {
                        return Et.scale(this.array, this.array, e), this._dirty = !0, this
                      },
                      scaleAndAdd: function (e, t) {
                        return Et.scaleAndAdd(this.array, this.array, e.array, t), this._dirty = !0, this
                      },
                      sqrDist: function (e) {
                        return Et.sqrDist(this.array, e.array)
                      },
                      squaredDistance: function (e) {
                        return Et.squaredDistance(this.array, e.array)
                      },
                      sqrLen: function () {
                        return Et.sqrLen(this.array)
                      },
                      squaredLength: function () {
                        return Et.squaredLength(this.array)
                      },
                      sub: function (e) {
                        return Et.sub(this.array, this.array, e.array), this._dirty = !0, this
                      },
                      subtract: function (e) {
                        return Et.subtract(this.array, this.array, e.array), this._dirty = !0, this
                      },
                      transformMat4: function (e) {
                        return Et.transformMat4(this.array, this.array, e.array), this._dirty = !0, this
                      },
                      transformQuat: function (e) {
                        return Et.transformQuat(this.array, this.array, e.array), this._dirty = !0, this
                      },
                      toString: function () {
                        return "[" + Array.prototype.join.call(this.array, ",") + "]"
                      },
                      toArray: function () {
                        return Array.prototype.slice.call(this.array)
                      }
                    };
                    var Nn = Object.defineProperty;
                    if (Nn) {
                      var In = On.prototype;
                      Nn(In, "x", {
                        get: function () {
                          return this.array[0]
                        },
                        set: function (e) {
                          this.array[0] = e, this._dirty = !0
                        }
                      }), Nn(In, "y", {
                        get: function () {
                          return this.array[1]
                        },
                        set: function (e) {
                          this.array[1] = e, this._dirty = !0
                        }
                      }), Nn(In, "z", {
                        get: function () {
                          return this.array[2]
                        },
                        set: function (e) {
                          this.array[2] = e, this._dirty = !0
                        }
                      }), Nn(In, "w", {
                        get: function () {
                          return this.array[3]
                        },
                        set: function (e) {
                          this.array[3] = e, this._dirty = !0
                        }
                      })
                    }
                    On.add = function (e, t, r) {
                      return Et.add(e.array, t.array, r.array), e._dirty = !0, e
                    }, On.set = function (e, t, r, i, n) {
                      Et.set(e.array, t, r, i, n), e._dirty = !0
                    }, On.copy = function (e, t) {
                      return Et.copy(e.array, t.array), e._dirty = !0, e
                    }, On.distance = On.dist = function (e, t) {
                      return Et.distance(e.array, t.array)
                    }, On.divide = On.div = function (e, t, r) {
                      return Et.divide(e.array, t.array, r.array), e._dirty = !0, e
                    }, On.dot = function (e, t) {
                      return Et.dot(e.array, t.array)
                    }, On.len = function (e) {
                      return Et.length(e.array)
                    }, On.lerp = function (e, t, r, i) {
                      return Et.lerp(e.array, t.array, r.array, i), e._dirty = !0, e
                    }, On.min = function (e, t, r) {
                      return Et.min(e.array, t.array, r.array), e._dirty = !0, e
                    }, On.max = function (e, t, r) {
                      return Et.max(e.array, t.array, r.array), e._dirty = !0, e
                    }, On.multiply = On.mul = function (e, t, r) {
                      return Et.multiply(e.array, t.array, r.array), e._dirty = !0, e
                    }, On.negate = function (e, t) {
                      return Et.negate(e.array, t.array), e._dirty = !0, e
                    }, On.normalize = function (e, t) {
                      return Et.normalize(e.array, t.array), e._dirty = !0, e
                    }, On.random = function (e, t) {
                      return Et.random(e.array, t), e._dirty = !0, e
                    }, On.scale = function (e, t, r) {
                      return Et.scale(e.array, t.array, r), e._dirty = !0, e
                    }, On.scaleAndAdd = function (e, t, r, i) {
                      return Et.scaleAndAdd(e.array, t.array, r.array, i), e._dirty = !0, e
                    }, On.squaredDistance = On.sqrDist = function (e, t) {
                      return Et.sqrDist(e.array, t.array)
                    }, On.squaredLength = On.sqrLen = function (e) {
                      return Et.sqrLen(e.array)
                    }, On.subtract = On.sub = function (e, t, r) {
                      return Et.subtract(e.array, t.array, r.array), e._dirty = !0, e
                    }, On.transformMat4 = function (e, t, r) {
                      return Et.transformMat4(e.array, t.array, r.array), e._dirty = !0, e
                    }, On.transformQuat = function (e, t, r) {
                      return Et.transformQuat(e.array, t.array, r.array), e._dirty = !0, e
                    };
                    const Rn = On;
                    var Bn = {
                      create: function () {
                        var e = new ce(4);
                        return e[0] = 1, e[1] = 0, e[2] = 0, e[3] = 1, e
                      },
                      clone: function (e) {
                        var t = new ce(4);
                        return t[0] = e[0], t[1] = e[1], t[2] = e[2], t[3] = e[3], t
                      },
                      copy: function (e, t) {
                        return e[0] = t[0], e[1] = t[1], e[2] = t[2], e[3] = t[3], e
                      },
                      identity: function (e) {
                        return e[0] = 1, e[1] = 0, e[2] = 0, e[3] = 1, e
                      },
                      transpose: function (e, t) {
                        if (e === t) {
                          var r = t[1];
                          e[1] = t[2], e[2] = r
                        } else e[0] = t[0], e[1] = t[2], e[2] = t[1], e[3] = t[3];
                        return e
                      },
                      invert: function (e, t) {
                        var r = t[0],
                          i = t[1],
                          n = t[2],
                          a = t[3],
                          o = r * a - n * i;
                        return o ? (o = 1 / o, e[0] = a * o, e[1] = -i * o, e[2] = -n * o, e[3] = r * o, e) : null
                      },
                      adjoint: function (e, t) {
                        var r = t[0];
                        return e[0] = t[3], e[1] = -t[1], e[2] = -t[2], e[3] = r, e
                      },
                      determinant: function (e) {
                        return e[0] * e[3] - e[2] * e[1]
                      },
                      multiply: function (e, t, r) {
                        var i = t[0],
                          n = t[1],
                          a = t[2],
                          o = t[3],
                          s = r[0],
                          l = r[1],
                          h = r[2],
                          u = r[3];
                        return e[0] = i * s + a * l, e[1] = n * s + o * l, e[2] = i * h + a * u, e[3] = n * h + o * u, e
                      }
                    };
                    Bn.mul = Bn.multiply, Bn.rotate = function (e, t, r) {
                      var i = t[0],
                        n = t[1],
                        a = t[2],
                        o = t[3],
                        s = Math.sin(r),
                        l = Math.cos(r);
                      return e[0] = i * l + a * s, e[1] = n * l + o * s, e[2] = i * -s + a * l, e[3] = n * -s + o * l, e
                    }, Bn.scale = function (e, t, r) {
                      var i = t[0],
                        n = t[1],
                        a = t[2],
                        o = t[3],
                        s = r[0],
                        l = r[1];
                      return e[0] = i * s, e[1] = n * s, e[2] = a * l, e[3] = o * l, e
                    }, Bn.frob = function (e) {
                      return Math.sqrt(Math.pow(e[0], 2) + Math.pow(e[1], 2) + Math.pow(e[2], 2) + Math.pow(e[3], 2))
                    }, Bn.LDU = function (e, t, r, i) {
                      return e[2] = i[2] / i[0], r[0] = i[0], r[1] = i[1], r[3] = i[3] - e[2] * r[1], [e, t, r]
                    };
                    const Fn = Bn;
                    var zn = function () {
                      this.array = Fn.create(), this._dirty = !0
                    };
                    zn.prototype = {
                      constructor: zn,
                      setArray: function (e) {
                        for (var t = 0; t < this.array.length; t++) this.array[t] = e[t];
                        return this._dirty = !0, this
                      },
                      clone: function () {
                        return (new zn).copy(this)
                      },
                      copy: function (e) {
                        return Fn.copy(this.array, e.array), this._dirty = !0, this
                      },
                      adjoint: function () {
                        return Fn.adjoint(this.array, this.array), this._dirty = !0, this
                      },
                      determinant: function () {
                        return Fn.determinant(this.array)
                      },
                      identity: function () {
                        return Fn.identity(this.array), this._dirty = !0, this
                      },
                      invert: function () {
                        return Fn.invert(this.array, this.array), this._dirty = !0, this
                      },
                      mul: function (e) {
                        return Fn.mul(this.array, this.array, e.array), this._dirty = !0, this
                      },
                      mulLeft: function (e) {
                        return Fn.mul(this.array, e.array, this.array), this._dirty = !0, this
                      },
                      multiply: function (e) {
                        return Fn.multiply(this.array, this.array, e.array), this._dirty = !0, this
                      },
                      multiplyLeft: function (e) {
                        return Fn.multiply(this.array, e.array, this.array), this._dirty = !0, this
                      },
                      rotate: function (e) {
                        return Fn.rotate(this.array, this.array, e), this._dirty = !0, this
                      },
                      scale: function (e) {
                        return Fn.scale(this.array, this.array, e.array), this._dirty = !0, this
                      },
                      transpose: function () {
                        return Fn.transpose(this.array, this.array), this._dirty = !0, this
                      },
                      toString: function () {
                        return "[" + Array.prototype.join.call(this.array, ",") + "]"
                      },
                      toArray: function () {
                        return Array.prototype.slice.call(this.array)
                      }
                    }, zn.adjoint = function (e, t) {
                      return Fn.adjoint(e.array, t.array), e._dirty = !0, e
                    }, zn.copy = function (e, t) {
                      return Fn.copy(e.array, t.array), e._dirty = !0, e
                    }, zn.determinant = function (e) {
                      return Fn.determinant(e.array)
                    }, zn.identity = function (e) {
                      return Fn.identity(e.array), e._dirty = !0, e
                    }, zn.invert = function (e, t) {
                      return Fn.invert(e.array, t.array), e._dirty = !0, e
                    }, zn.multiply = zn.mul = function (e, t, r) {
                      return Fn.mul(e.array, t.array, r.array), e._dirty = !0, e
                    }, zn.rotate = function (e, t, r) {
                      return Fn.rotate(e.array, t.array, r), e._dirty = !0, e
                    }, zn.scale = function (e, t, r) {
                      return Fn.scale(e.array, t.array, r.array), e._dirty = !0, e
                    }, zn.transpose = function (e, t) {
                      return Fn.transpose(e.array, t.array), e._dirty = !0, e
                    };
                    const Gn = zn;
                    var Un = {
                      create: function () {
                        var e = new ce(6);
                        return e[0] = 1, e[1] = 0, e[2] = 0, e[3] = 1, e[4] = 0, e[5] = 0, e
                      },
                      clone: function (e) {
                        var t = new ce(6);
                        return t[0] = e[0], t[1] = e[1], t[2] = e[2], t[3] = e[3], t[4] = e[4], t[5] = e[5], t
                      },
                      copy: function (e, t) {
                        return e[0] = t[0], e[1] = t[1], e[2] = t[2], e[3] = t[3], e[4] = t[4], e[5] = t[5], e
                      },
                      identity: function (e) {
                        return e[0] = 1, e[1] = 0, e[2] = 0, e[3] = 1, e[4] = 0, e[5] = 0, e
                      },
                      invert: function (e, t) {
                        var r = t[0],
                          i = t[1],
                          n = t[2],
                          a = t[3],
                          o = t[4],
                          s = t[5],
                          l = r * a - i * n;
                        return l ? (l = 1 / l, e[0] = a * l, e[1] = -i * l, e[2] = -n * l, e[3] = r * l, e[4] = (n * s - a * o) * l, e[5] = (i * o - r * s) * l, e) : null
                      },
                      determinant: function (e) {
                        return e[0] * e[3] - e[1] * e[2]
                      },
                      multiply: function (e, t, r) {
                        var i = t[0],
                          n = t[1],
                          a = t[2],
                          o = t[3],
                          s = t[4],
                          l = t[5],
                          h = r[0],
                          u = r[1],
                          c = r[2],
                          d = r[3],
                          f = r[4],
                          p = r[5];
                        return e[0] = i * h + a * u, e[1] = n * h + o * u, e[2] = i * c + a * d, e[3] = n * c + o * d, e[4] = i * f + a * p + s, e[5] = n * f + o * p + l, e
                      }
                    };
                    Un.mul = Un.multiply, Un.rotate = function (e, t, r) {
                      var i = t[0],
                        n = t[1],
                        a = t[2],
                        o = t[3],
                        s = t[4],
                        l = t[5],
                        h = Math.sin(r),
                        u = Math.cos(r);
                      return e[0] = i * u + a * h, e[1] = n * u + o * h, e[2] = i * -h + a * u, e[3] = n * -h + o * u, e[4] = s, e[5] = l, e
                    }, Un.scale = function (e, t, r) {
                      var i = t[0],
                        n = t[1],
                        a = t[2],
                        o = t[3],
                        s = t[4],
                        l = t[5],
                        h = r[0],
                        u = r[1];
                      return e[0] = i * h, e[1] = n * h, e[2] = a * u, e[3] = o * u, e[4] = s, e[5] = l, e
                    }, Un.translate = function (e, t, r) {
                      var i = t[0],
                        n = t[1],
                        a = t[2],
                        o = t[3],
                        s = t[4],
                        l = t[5],
                        h = r[0],
                        u = r[1];
                      return e[0] = i, e[1] = n, e[2] = a, e[3] = o, e[4] = i * h + a * u + s, e[5] = n * h + o * u + l, e
                    }, Un.frob = function (e) {
                      return Math.sqrt(Math.pow(e[0], 2) + Math.pow(e[1], 2) + Math.pow(e[2], 2) + Math.pow(e[3], 2) + Math.pow(e[4], 2) + Math.pow(e[5], 2) + 1)
                    };
                    const kn = Un;
                    var Vn = function () {
                      this.array = kn.create(), this._dirty = !0
                    };
                    Vn.prototype = {
                      constructor: Vn,
                      setArray: function (e) {
                        for (var t = 0; t < this.array.length; t++) this.array[t] = e[t];
                        return this._dirty = !0, this
                      },
                      clone: function () {
                        return (new Vn).copy(this)
                      },
                      copy: function (e) {
                        return kn.copy(this.array, e.array), this._dirty = !0, this
                      },
                      determinant: function () {
                        return kn.determinant(this.array)
                      },
                      identity: function () {
                        return kn.identity(this.array), this._dirty = !0, this
                      },
                      invert: function () {
                        return kn.invert(this.array, this.array), this._dirty = !0, this
                      },
                      mul: function (e) {
                        return kn.mul(this.array, this.array, e.array), this._dirty = !0, this
                      },
                      mulLeft: function (e) {
                        return kn.mul(this.array, e.array, this.array), this._dirty = !0, this
                      },
                      multiply: function (e) {
                        return kn.multiply(this.array, this.array, e.array), this._dirty = !0, this
                      },
                      multiplyLeft: function (e) {
                        return kn.multiply(this.array, e.array, this.array), this._dirty = !0, this
                      },
                      rotate: function (e) {
                        return kn.rotate(this.array, this.array, e), this._dirty = !0, this
                      },
                      scale: function (e) {
                        return kn.scale(this.array, this.array, e.array), this._dirty = !0, this
                      },
                      translate: function (e) {
                        return kn.translate(this.array, this.array, e.array), this._dirty = !0, this
                      },
                      toString: function () {
                        return "[" + Array.prototype.join.call(this.array, ",") + "]"
                      },
                      toArray: function () {
                        return Array.prototype.slice.call(this.array)
                      }
                    }, Vn.copy = function (e, t) {
                      return kn.copy(e.array, t.array), e._dirty = !0, e
                    }, Vn.determinant = function (e) {
                      return kn.determinant(e.array)
                    }, Vn.identity = function (e) {
                      return kn.identity(e.array), e._dirty = !0, e
                    }, Vn.invert = function (e, t) {
                      return kn.invert(e.array, t.array), e._dirty = !0, e
                    }, Vn.multiply = Vn.mul = function (e, t, r) {
                      return kn.mul(e.array, t.array, r.array), e._dirty = !0, e
                    }, Vn.rotate = function (e, t, r) {
                      return kn.rotate(e.array, t.array, r), e._dirty = !0, e
                    }, Vn.scale = function (e, t, r) {
                      return kn.scale(e.array, t.array, r.array), e._dirty = !0, e
                    }, Vn.translate = function (e, t, r) {
                      return kn.translate(e.array, t.array, r.array), e._dirty = !0, e
                    };
                    const Hn = Vn;
                    var Wn = function () {
                      this.array = Dt.create(), this._dirty = !0
                    };
                    Wn.prototype = {
                      constructor: Wn,
                      setArray: function (e) {
                        for (var t = 0; t < this.array.length; t++) this.array[t] = e[t];
                        return this._dirty = !0, this
                      },
                      adjoint: function () {
                        return Dt.adjoint(this.array, this.array), this._dirty = !0, this
                      },
                      clone: function () {
                        return (new Wn).copy(this)
                      },
                      copy: function (e) {
                        return Dt.copy(this.array, e.array), this._dirty = !0, this
                      },
                      determinant: function () {
                        return Dt.determinant(this.array)
                      },
                      fromMat2d: function (e) {
                        return Dt.fromMat2d(this.array, e.array), this._dirty = !0, this
                      },
                      fromMat4: function (e) {
                        return Dt.fromMat4(this.array, e.array), this._dirty = !0, this
                      },
                      fromQuat: function (e) {
                        return Dt.fromQuat(this.array, e.array), this._dirty = !0, this
                      },
                      identity: function () {
                        return Dt.identity(this.array), this._dirty = !0, this
                      },
                      invert: function () {
                        return Dt.invert(this.array, this.array), this._dirty = !0, this
                      },
                      mul: function (e) {
                        return Dt.mul(this.array, this.array, e.array), this._dirty = !0, this
                      },
                      mulLeft: function (e) {
                        return Dt.mul(this.array, e.array, this.array), this._dirty = !0, this
                      },
                      multiply: function (e) {
                        return Dt.multiply(this.array, this.array, e.array), this._dirty = !0, this
                      },
                      multiplyLeft: function (e) {
                        return Dt.multiply(this.array, e.array, this.array), this._dirty = !0, this
                      },
                      rotate: function (e) {
                        return Dt.rotate(this.array, this.array, e), this._dirty = !0, this
                      },
                      scale: function (e) {
                        return Dt.scale(this.array, this.array, e.array), this._dirty = !0, this
                      },
                      translate: function (e) {
                        return Dt.translate(this.array, this.array, e.array), this._dirty = !0, this
                      },
                      normalFromMat4: function (e) {
                        return Dt.normalFromMat4(this.array, e.array), this._dirty = !0, this
                      },
                      transpose: function () {
                        return Dt.transpose(this.array, this.array), this._dirty = !0, this
                      },
                      toString: function () {
                        return "[" + Array.prototype.join.call(this.array, ",") + "]"
                      },
                      toArray: function () {
                        return Array.prototype.slice.call(this.array)
                      }
                    }, Wn.adjoint = function (e, t) {
                      return Dt.adjoint(e.array, t.array), e._dirty = !0, e
                    }, Wn.copy = function (e, t) {
                      return Dt.copy(e.array, t.array), e._dirty = !0, e
                    }, Wn.determinant = function (e) {
                      return Dt.determinant(e.array)
                    }, Wn.identity = function (e) {
                      return Dt.identity(e.array), e._dirty = !0, e
                    }, Wn.invert = function (e, t) {
                      return Dt.invert(e.array, t.array), e
                    }, Wn.multiply = Wn.mul = function (e, t, r) {
                      return Dt.mul(e.array, t.array, r.array), e._dirty = !0, e
                    }, Wn.fromMat2d = function (e, t) {
                      return Dt.fromMat2d(e.array, t.array), e._dirty = !0, e
                    }, Wn.fromMat4 = function (e, t) {
                      return Dt.fromMat4(e.array, t.array), e._dirty = !0, e
                    }, Wn.fromQuat = function (e, t) {
                      return Dt.fromQuat(e.array, t.array), e._dirty = !0, e
                    }, Wn.normalFromMat4 = function (e, t) {
                      return Dt.normalFromMat4(e.array, t.array), e._dirty = !0, e
                    }, Wn.rotate = function (e, t, r) {
                      return Dt.rotate(e.array, t.array, r), e._dirty = !0, e
                    }, Wn.scale = function (e, t, r) {
                      return Dt.scale(e.array, t.array, r.array), e._dirty = !0, e
                    }, Wn.transpose = function (e, t) {
                      return Dt.transpose(e.array, t.array), e._dirty = !0, e
                    }, Wn.translate = function (e, t, r) {
                      return Dt.translate(e.array, t.array, r.array), e._dirty = !0, e
                    };
                    const jn = Wn;
                    var Xn = {
                      linear: function (e) {
                        return e
                      },
                      quadraticIn: function (e) {
                        return e * e
                      },
                      quadraticOut: function (e) {
                        return e * (2 - e)
                      },
                      quadraticInOut: function (e) {
                        return (e *= 2) < 1 ? .5 * e * e : -.5 * (--e * (e - 2) - 1)
                      },
                      cubicIn: function (e) {
                        return e * e * e
                      },
                      cubicOut: function (e) {
                        return --e * e * e + 1
                      },
                      cubicInOut: function (e) {
                        return (e *= 2) < 1 ? .5 * e * e * e : .5 * ((e -= 2) * e * e + 2)
                      },
                      quarticIn: function (e) {
                        return e * e * e * e
                      },
                      quarticOut: function (e) {
                        return 1 - --e * e * e * e
                      },
                      quarticInOut: function (e) {
                        return (e *= 2) < 1 ? .5 * e * e * e * e : -.5 * ((e -= 2) * e * e * e - 2)
                      },
                      quinticIn: function (e) {
                        return e * e * e * e * e
                      },
                      quinticOut: function (e) {
                        return --e * e * e * e * e + 1
                      },
                      quinticInOut: function (e) {
                        return (e *= 2) < 1 ? .5 * e * e * e * e * e : .5 * ((e -= 2) * e * e * e * e + 2)
                      },
                      sinusoidalIn: function (e) {
                        return 1 - Math.cos(e * Math.PI / 2)
                      },
                      sinusoidalOut: function (e) {
                        return Math.sin(e * Math.PI / 2)
                      },
                      sinusoidalInOut: function (e) {
                        return .5 * (1 - Math.cos(Math.PI * e))
                      },
                      exponentialIn: function (e) {
                        return 0 === e ? 0 : Math.pow(1024, e - 1)
                      },
                      exponentialOut: function (e) {
                        return 1 === e ? 1 : 1 - Math.pow(2, -10 * e)
                      },
                      exponentialInOut: function (e) {
                        return 0 === e ? 0 : 1 === e ? 1 : (e *= 2) < 1 ? .5 * Math.pow(1024, e - 1) : .5 * (2 - Math.pow(2, -10 * (e - 1)))
                      },
                      circularIn: function (e) {
                        return 1 - Math.sqrt(1 - e * e)
                      },
                      circularOut: function (e) {
                        return Math.sqrt(1 - --e * e)
                      },
                      circularInOut: function (e) {
                        return (e *= 2) < 1 ? -.5 * (Math.sqrt(1 - e * e) - 1) : .5 * (Math.sqrt(1 - (e -= 2) * e) + 1)
                      },
                      elasticIn: function (e) {
                        var t, r = .1;
                        return 0 === e ? 0 : 1 === e ? 1 : (!r || r < 1 ? (r = 1, t = .1) : t = .4 * Math.asin(1 / r) / (2 * Math.PI), -r * Math.pow(2, 10 * (e -= 1)) * Math.sin((e - t) * (2 * Math.PI) / .4))
                      },
                      elasticOut: function (e) {
                        var t, r = .1;
                        return 0 === e ? 0 : 1 === e ? 1 : (!r || r < 1 ? (r = 1, t = .1) : t = .4 * Math.asin(1 / r) / (2 * Math.PI), r * Math.pow(2, -10 * e) * Math.sin((e - t) * (2 * Math.PI) / .4) + 1)
                      },
                      elasticInOut: function (e) {
                        var t, r = .1;
                        return 0 === e ? 0 : 1 === e ? 1 : (!r || r < 1 ? (r = 1, t = .1) : t = .4 * Math.asin(1 / r) / (2 * Math.PI), (e *= 2) < 1 ? r * Math.pow(2, 10 * (e -= 1)) * Math.sin((e - t) * (2 * Math.PI) / .4) * -.5 : r * Math.pow(2, -10 * (e -= 1)) * Math.sin((e - t) * (2 * Math.PI) / .4) * .5 + 1)
                      },
                      backIn: function (e) {
                        var t = 1.70158;
                        return e * e * ((t + 1) * e - t)
                      },
                      backOut: function (e) {
                        var t = 1.70158;
                        return --e * e * ((t + 1) * e + t) + 1
                      },
                      backInOut: function (e) {
                        var t = 2.5949095;
                        return (e *= 2) < 1 ? e * e * ((t + 1) * e - t) * .5 : .5 * ((e -= 2) * e * ((t + 1) * e + t) + 2)
                      },
                      bounceIn: function (e) {
                        return 1 - Xn.bounceOut(1 - e)
                      },
                      bounceOut: function (e) {
                        return e < 1 / 2.75 ? 7.5625 * e * e : e < 2 / 2.75 ? 7.5625 * (e -= 1.5 / 2.75) * e + .75 : e < 2.5 / 2.75 ? 7.5625 * (e -= 2.25 / 2.75) * e + .9375 : 7.5625 * (e -= 2.625 / 2.75) * e + .984375
                      },
                      bounceInOut: function (e) {
                        return e < .5 ? .5 * Xn.bounceIn(2 * e) : .5 * Xn.bounceOut(2 * e - 1) + .5
                      }
                    };
                    const qn = Xn,
                      Zn = function () {
                        function e(e) {
                          this._initialized = !1, this._startTime = 0, this._pausedTime = 0, this._paused = !1, this._life = e.life || 1e3, this._delay = e.delay || 0, this.loop = null != e.loop && e.loop, this.gap = e.gap || 0, this.easing = e.easing || "linear", this.onframe = e.onframe, this.ondestroy = e.ondestroy, this.onrestart = e.onrestart
                        }
                        return e.prototype.step = function (e, t) {
                          if (this._initialized || (this._startTime = e + this._delay, this._initialized = !0), !this._paused) {
                            var r = (e - this._startTime - this._pausedTime) / this._life;
                            r < 0 && (r = 0), r = Math.min(r, 1);
                            var i = this.easing,
                              n = "string" == typeof i ? qn[i] : i,
                              a = "function" == typeof n ? n(r) : r;
                            if (this.onframe && this.onframe(a), 1 === r) {
                              if (!this.loop) return !0;
                              this._restart(e), this.onrestart && this.onrestart()
                            }
                            return !1
                          }
                          this._pausedTime += t
                        }, e.prototype._restart = function (e) {
                          var t = (e - this._startTime - this._pausedTime) % this._life;
                          this._startTime = e - t + this.gap, this._pausedTime = 0
                        }, e.prototype.pause = function () {
                          this._paused = !0
                        }, e.prototype.resume = function () {
                          this._paused = !1
                        }, e
                      }();
                    var Yn = {
                      transparent: [0, 0, 0, 0],
                      aliceblue: [240, 248, 255, 1],
                      antiquewhite: [250, 235, 215, 1],
                      aqua: [0, 255, 255, 1],
                      aquamarine: [127, 255, 212, 1],
                      azure: [240, 255, 255, 1],
                      beige: [245, 245, 220, 1],
                      bisque: [255, 228, 196, 1],
                      black: [0, 0, 0, 1],
                      blanchedalmond: [255, 235, 205, 1],
                      blue: [0, 0, 255, 1],
                      blueviolet: [138, 43, 226, 1],
                      brown: [165, 42, 42, 1],
                      burlywood: [222, 184, 135, 1],
                      cadetblue: [95, 158, 160, 1],
                      chartreuse: [127, 255, 0, 1],
                      chocolate: [210, 105, 30, 1],
                      coral: [255, 127, 80, 1],
                      cornflowerblue: [100, 149, 237, 1],
                      cornsilk: [255, 248, 220, 1],
                      crimson: [220, 20, 60, 1],
                      cyan: [0, 255, 255, 1],
                      darkblue: [0, 0, 139, 1],
                      darkcyan: [0, 139, 139, 1],
                      darkgoldenrod: [184, 134, 11, 1],
                      darkgray: [169, 169, 169, 1],
                      darkgreen: [0, 100, 0, 1],
                      darkgrey: [169, 169, 169, 1],
                      darkkhaki: [189, 183, 107, 1],
                      darkmagenta: [139, 0, 139, 1],
                      darkolivegreen: [85, 107, 47, 1],
                      darkorange: [255, 140, 0, 1],
                      darkorchid: [153, 50, 204, 1],
                      darkred: [139, 0, 0, 1],
                      darksalmon: [233, 150, 122, 1],
                      darkseagreen: [143, 188, 143, 1],
                      darkslateblue: [72, 61, 139, 1],
                      darkslategray: [47, 79, 79, 1],
                      darkslategrey: [47, 79, 79, 1],
                      darkturquoise: [0, 206, 209, 1],
                      darkviolet: [148, 0, 211, 1],
                      deeppink: [255, 20, 147, 1],
                      deepskyblue: [0, 191, 255, 1],
                      dimgray: [105, 105, 105, 1],
                      dimgrey: [105, 105, 105, 1],
                      dodgerblue: [30, 144, 255, 1],
                      firebrick: [178, 34, 34, 1],
                      floralwhite: [255, 250, 240, 1],
                      forestgreen: [34, 139, 34, 1],
                      fuchsia: [255, 0, 255, 1],
                      gainsboro: [220, 220, 220, 1],
                      ghostwhite: [248, 248, 255, 1],
                      gold: [255, 215, 0, 1],
                      goldenrod: [218, 165, 32, 1],
                      gray: [128, 128, 128, 1],
                      green: [0, 128, 0, 1],
                      greenyellow: [173, 255, 47, 1],
                      grey: [128, 128, 128, 1],
                      honeydew: [240, 255, 240, 1],
                      hotpink: [255, 105, 180, 1],
                      indianred: [205, 92, 92, 1],
                      indigo: [75, 0, 130, 1],
                      ivory: [255, 255, 240, 1],
                      khaki: [240, 230, 140, 1],
                      lavender: [230, 230, 250, 1],
                      lavenderblush: [255, 240, 245, 1],
                      lawngreen: [124, 252, 0, 1],
                      lemonchiffon: [255, 250, 205, 1],
                      lightblue: [173, 216, 230, 1],
                      lightcoral: [240, 128, 128, 1],
                      lightcyan: [224, 255, 255, 1],
                      lightgoldenrodyellow: [250, 250, 210, 1],
                      lightgray: [211, 211, 211, 1],
                      lightgreen: [144, 238, 144, 1],
                      lightgrey: [211, 211, 211, 1],
                      lightpink: [255, 182, 193, 1],
                      lightsalmon: [255, 160, 122, 1],
                      lightseagreen: [32, 178, 170, 1],
                      lightskyblue: [135, 206, 250, 1],
                      lightslategray: [119, 136, 153, 1],
                      lightslategrey: [119, 136, 153, 1],
                      lightsteelblue: [176, 196, 222, 1],
                      lightyellow: [255, 255, 224, 1],
                      lime: [0, 255, 0, 1],
                      limegreen: [50, 205, 50, 1],
                      linen: [250, 240, 230, 1],
                      magenta: [255, 0, 255, 1],
                      maroon: [128, 0, 0, 1],
                      mediumaquamarine: [102, 205, 170, 1],
                      mediumblue: [0, 0, 205, 1],
                      mediumorchid: [186, 85, 211, 1],
                      mediumpurple: [147, 112, 219, 1],
                      mediumseagreen: [60, 179, 113, 1],
                      mediumslateblue: [123, 104, 238, 1],
                      mediumspringgreen: [0, 250, 154, 1],
                      mediumturquoise: [72, 209, 204, 1],
                      mediumvioletred: [199, 21, 133, 1],
                      midnightblue: [25, 25, 112, 1],
                      mintcream: [245, 255, 250, 1],
                      mistyrose: [255, 228, 225, 1],
                      moccasin: [255, 228, 181, 1],
                      navajowhite: [255, 222, 173, 1],
                      navy: [0, 0, 128, 1],
                      oldlace: [253, 245, 230, 1],
                      olive: [128, 128, 0, 1],
                      olivedrab: [107, 142, 35, 1],
                      orange: [255, 165, 0, 1],
                      orangered: [255, 69, 0, 1],
                      orchid: [218, 112, 214, 1],
                      palegoldenrod: [238, 232, 170, 1],
                      palegreen: [152, 251, 152, 1],
                      paleturquoise: [175, 238, 238, 1],
                      palevioletred: [219, 112, 147, 1],
                      papayawhip: [255, 239, 213, 1],
                      peachpuff: [255, 218, 185, 1],
                      peru: [205, 133, 63, 1],
                      pink: [255, 192, 203, 1],
                      plum: [221, 160, 221, 1],
                      powderblue: [176, 224, 230, 1],
                      purple: [128, 0, 128, 1],
                      red: [255, 0, 0, 1],
                      rosybrown: [188, 143, 143, 1],
                      royalblue: [65, 105, 225, 1],
                      saddlebrown: [139, 69, 19, 1],
                      salmon: [250, 128, 114, 1],
                      sandybrown: [244, 164, 96, 1],
                      seagreen: [46, 139, 87, 1],
                      seashell: [255, 245, 238, 1],
                      sienna: [160, 82, 45, 1],
                      silver: [192, 192, 192, 1],
                      skyblue: [135, 206, 235, 1],
                      slateblue: [106, 90, 205, 1],
                      slategray: [112, 128, 144, 1],
                      slategrey: [112, 128, 144, 1],
                      snow: [255, 250, 250, 1],
                      springgreen: [0, 255, 127, 1],
                      steelblue: [70, 130, 180, 1],
                      tan: [210, 180, 140, 1],
                      teal: [0, 128, 128, 1],
                      thistle: [216, 191, 216, 1],
                      tomato: [255, 99, 71, 1],
                      turquoise: [64, 224, 208, 1],
                      violet: [238, 130, 238, 1],
                      wheat: [245, 222, 179, 1],
                      white: [255, 255, 255, 1],
                      whitesmoke: [245, 245, 245, 1],
                      yellow: [255, 255, 0, 1],
                      yellowgreen: [154, 205, 50, 1]
                    };

                    function Kn(e) {
                      return (e = Math.round(e)) < 0 ? 0 : e > 255 ? 255 : e
                    }

                    function Qn(e) {
                      return e < 0 ? 0 : e > 1 ? 1 : e
                    }

                    function Jn(e) {
                      var t = e;
                      return t.length && "%" === t.charAt(t.length - 1) ? Kn(parseFloat(t) / 100 * 255) : Kn(parseInt(t, 10))
                    }

                    function $n(e) {
                      var t = e;
                      return t.length && "%" === t.charAt(t.length - 1) ? Qn(parseFloat(t) / 100) : Qn(parseFloat(t))
                    }

                    function ea(e, t, r) {
                      return r < 0 ? r += 1 : r > 1 && (r -= 1), 6 * r < 1 ? e + (t - e) * r * 6 : 2 * r < 1 ? t : 3 * r < 2 ? e + (t - e) * (2 / 3 - r) * 6 : e
                    }

                    function ta(e, t, r, i, n) {
                      return e[0] = t, e[1] = r, e[2] = i, e[3] = n, e
                    }

                    function ra(e, t) {
                      return e[0] = t[0], e[1] = t[1], e[2] = t[2], e[3] = t[3], e
                    }
                    var ia = new bi(20),
                      na = null;

                    function aa(e, t) {
                      na && ra(na, t), na = ia.put(e, na || t.slice())
                    }

                    function oa(e, t) {
                      if (e) {
                        t = t || [];
                        var r = ia.get(e);
                        if (r) return ra(t, r);
                        var i = (e += "").replace(/ /g, "").toLowerCase();
                        if (i in Yn) return ra(t, Yn[i]), aa(e, t), t;
                        var n, a = i.length;
                        if ("#" === i.charAt(0)) return 4 === a || 5 === a ? (n = parseInt(i.slice(1, 4), 16)) >= 0 && n <= 4095 ? (ta(t, (3840 & n) >> 4 | (3840 & n) >> 8, 240 & n | (240 & n) >> 4, 15 & n | (15 & n) << 4, 5 === a ? parseInt(i.slice(4), 16) / 15 : 1), aa(e, t), t) : void ta(t, 0, 0, 0, 1) : 7 === a || 9 === a ? (n = parseInt(i.slice(1, 7), 16)) >= 0 && n <= 16777215 ? (ta(t, (16711680 & n) >> 16, (65280 & n) >> 8, 255 & n, 9 === a ? parseInt(i.slice(7), 16) / 255 : 1), aa(e, t), t) : void ta(t, 0, 0, 0, 1) : void 0;
                        var o = i.indexOf("("),
                          s = i.indexOf(")");
                        if (-1 !== o && s + 1 === a) {
                          var l = i.substr(0, o),
                            h = i.substr(o + 1, s - (o + 1)).split(","),
                            u = 1;
                          switch (l) {
                            case "rgba":
                              if (4 !== h.length) return 3 === h.length ? ta(t, +h[0], +h[1], +h[2], 1) : ta(t, 0, 0, 0, 1);
                              u = $n(h.pop());
                            case "rgb":
                              return 3 !== h.length ? void ta(t, 0, 0, 0, 1) : (ta(t, Jn(h[0]), Jn(h[1]), Jn(h[2]), u), aa(e, t), t);
                            case "hsla":
                              return 4 !== h.length ? void ta(t, 0, 0, 0, 1) : (h[3] = $n(h[3]), sa(h, t), aa(e, t), t);
                            case "hsl":
                              return 3 !== h.length ? void ta(t, 0, 0, 0, 1) : (sa(h, t), aa(e, t), t);
                            default:
                              return
                          }
                        }
                        ta(t, 0, 0, 0, 1)
                      }
                    }

                    function sa(e, t) {
                      var r = (parseFloat(e[0]) % 360 + 360) % 360 / 360,
                        i = $n(e[1]),
                        n = $n(e[2]),
                        a = n <= .5 ? n * (i + 1) : n + i - n * i,
                        o = 2 * n - a;
                      return ta(t = t || [], Kn(255 * ea(o, a, r + 1 / 3)), Kn(255 * ea(o, a, r)), Kn(255 * ea(o, a, r - 1 / 3)), 1), 4 === e.length && (t[3] = e[3]), t
                    }
                    var la = Object.prototype.toString,
                      ha = Array.prototype,
                      ua = ha.forEach,
                      ca = ha.filter,
                      da = ha.slice,
                      fa = ha.map,
                      pa = function () {}.constructor,
                      ma = pa ? pa.prototype : null;

                    function ga(e, t) {
                      if (Object.assign) Object.assign(e, t);
                      else
                        for (var r in t) t.hasOwnProperty(r) && (e[r] = t[r]);
                      return e
                    }

                    function _a(e, t, r) {
                      if (e = "prototype" in e ? e.prototype : e, t = "prototype" in t ? t.prototype : t, Object.getOwnPropertyNames)
                        for (var i = Object.getOwnPropertyNames(t), n = 0; n < i.length; n++) {
                          var a = i[n];
                          "constructor" !== a && (r ? null != t[a] : null == e[a]) && (e[a] = t[a])
                        } else ! function (e, t, r) {
                          for (var i = ba(t), n = 0; n < i.length; n++) {
                            var a = i[n];
                            (r ? null != t[a] : null == e[a]) && (e[a] = t[a])
                          }
                        }(e, t, r)
                    }

                    function va(e) {
                      return !!e && "string" != typeof e && "number" == typeof e.length
                    }

                    function ya(e, t, r) {
                      if (e && t)
                        if (e.forEach && e.forEach === ua) e.forEach(t, r);
                        else if (e.length === +e.length)
                        for (var i = 0, n = e.length; i < n; i++) t.call(r, e[i], i, e);
                      else
                        for (var a in e) e.hasOwnProperty(a) && t.call(r, e[a], a, e)
                    }

                    function xa(e, t, r) {
                      if (!e) return [];
                      if (!t) return Sa(e);
                      if (e.map && e.map === fa) return e.map(t, r);
                      for (var i = [], n = 0, a = e.length; n < a; n++) i.push(t.call(r, e[n], n, e));
                      return i
                    }

                    function ba(e) {
                      if (!e) return [];
                      if (Object.keys) return Object.keys(e);
                      var t = [];
                      for (var r in e) e.hasOwnProperty(r) && t.push(r);
                      return t
                    }

                    function wa(e) {
                      for (var t = [], r = 1; r < arguments.length; r++) t[r - 1] = arguments[r];
                      return function () {
                        return e.apply(this, t.concat(da.call(arguments)))
                      }
                    }

                    function Ta(e, t) {
                      return null != e ? e : t
                    }

                    function Sa(e) {
                      for (var t = [], r = 1; r < arguments.length; r++) t[r - 1] = arguments[r];
                      return da.apply(e, t)
                    }
                    ma && "function" == typeof ma.bind && ma.call.bind(ma.bind);
                    var Ma = function () {
                      function e(t) {
                        this.data = {};
                        var r, i = (r = t, Array.isArray ? Array.isArray(r) : "[object Array]" === la.call(r));
                        this.data = {};
                        var n = this;

                        function a(e, t) {
                          i ? n.set(e, t) : n.set(t, e)
                        }
                        t instanceof e ? t.each(a) : t && ya(t, a)
                      }
                      return e.prototype.get = function (e) {
                        return this.data.hasOwnProperty(e) ? this.data[e] : null
                      }, e.prototype.set = function (e, t) {
                        return this.data[e] = t
                      }, e.prototype.each = function (e, t) {
                        for (var r in this.data) this.data.hasOwnProperty(r) && e.call(t, this.data[r], r)
                      }, e.prototype.keys = function () {
                        return ba(this.data)
                      }, e.prototype.removeKey = function (e) {
                        delete this.data[e]
                      }, e
                    }();

                    function Aa(e, t) {
                      for (var r = new e.constructor(e.length + t.length), i = 0; i < e.length; i++) r[i] = e[i];
                      var n = e.length;
                      for (i = 0; i < t.length; i++) r[i + n] = t[i];
                      return r
                    }
                    var Ea = Array.prototype.slice;

                    function Ca(e, t, r) {
                      return (t - e) * r + e
                    }

                    function Da(e, t, r, i) {
                      for (var n = t.length, a = 0; a < n; a++) e[a] = Ca(t[a], r[a], i)
                    }

                    function La(e, t, r, i) {
                      for (var n = t.length, a = 0; a < n; a++) e[a] = t[a] + r[a] * i;
                      return e
                    }

                    function Pa(e, t, r, i) {
                      for (var n = t.length, a = n && t[0].length, o = 0; o < n; o++) {
                        e[o] || (e[o] = []);
                        for (var s = 0; s < a; s++) e[o][s] = t[o][s] + r[o][s] * i
                      }
                      return e
                    }

                    function Oa(e, t, r) {
                      var i = e,
                        n = t;
                      if (i.push && n.push) {
                        var a = i.length,
                          o = n.length;
                        if (a !== o)
                          if (a > o) i.length = o;
                          else
                            for (var s = a; s < o; s++) i.push(1 === r ? n[s] : Ea.call(n[s]));
                        var l = i[0] && i[0].length;
                        for (s = 0; s < i.length; s++)
                          if (1 === r) isNaN(i[s]) && (i[s] = n[s]);
                          else
                            for (var h = 0; h < l; h++) isNaN(i[s][h]) && (i[s][h] = n[s][h])
                      }
                    }

                    function Na(e, t) {
                      var r = e.length;
                      if (r !== t.length) return !1;
                      for (var i = 0; i < r; i++)
                        if (e[i] !== t[i]) return !1;
                      return !0
                    }

                    function Ia(e, t, r, i, n, a, o) {
                      var s = .5 * (r - e),
                        l = .5 * (i - t);
                      return (2 * (t - r) + s + l) * o + (-3 * (t - r) - 2 * s - l) * a + s * n + t
                    }

                    function Ra(e, t, r, i, n, a, o, s) {
                      for (var l = t.length, h = 0; h < l; h++) e[h] = Ia(t[h], r[h], i[h], n[h], a, o, s)
                    }

                    function Ba(e) {
                      if (va(e)) {
                        var t = e.length;
                        if (va(e[0])) {
                          for (var r = [], i = 0; i < t; i++) r.push(Ea.call(e[i]));
                          return r
                        }
                        return Ea.call(e)
                      }
                      return e
                    }

                    function Fa(e) {
                      return e[0] = Math.floor(e[0]), e[1] = Math.floor(e[1]), e[2] = Math.floor(e[2]), "rgba(" + e.join(",") + ")"
                    }
                    var za = [0, 0, 0, 0],
                      Ga = function () {
                        function e(e) {
                          this.keyframes = [], this.maxTime = 0, this.arrDim = 0, this.interpolable = !0, this._needsSort = !1, this._isAllValueEqual = !0, this._lastFrame = 0, this._lastFramePercent = 0, this.propName = e
                        }
                        return e.prototype.isFinished = function () {
                          return this._finished
                        }, e.prototype.setFinished = function () {
                          this._finished = !0, this._additiveTrack && this._additiveTrack.setFinished()
                        }, e.prototype.needsAnimate = function () {
                          return !this._isAllValueEqual && this.keyframes.length >= 2 && this.interpolable
                        }, e.prototype.getAdditiveTrack = function () {
                          return this._additiveTrack
                        }, e.prototype.addKeyframe = function (e, t) {
                          e >= this.maxTime ? this.maxTime = e : this._needsSort = !0;
                          var r = this.keyframes,
                            i = r.length;
                          if (this.interpolable)
                            if (va(t)) {
                              var n = function (e) {
                                return va(e && e[0]) ? 2 : 1
                              }(t);
                              if (i > 0 && this.arrDim !== n) return void(this.interpolable = !1);
                              if (1 === n && "number" != typeof t[0] || 2 === n && "number" != typeof t[0][0]) return void(this.interpolable = !1);
                              if (i > 0) {
                                var a = r[i - 1];
                                this._isAllValueEqual && (1 === n && Na(t, a.value) || (this._isAllValueEqual = !1))
                              }
                              this.arrDim = n
                            } else {
                              if (this.arrDim > 0) return void(this.interpolable = !1);
                              if ("string" == typeof t) {
                                var o = oa(t);
                                o ? (t = o, this.isValueColor = !0) : this.interpolable = !1
                              } else if ("number" != typeof t || isNaN(t)) return void(this.interpolable = !1);
                              this._isAllValueEqual && i > 0 && (a = r[i - 1], (this.isValueColor && !Na(a.value, t) || a.value !== t) && (this._isAllValueEqual = !1))
                            } var s = {
                            time: e,
                            value: t,
                            percent: 0
                          };
                          return this.keyframes.push(s), s
                        }, e.prototype.prepare = function (e) {
                          var t = this.keyframes;
                          this._needsSort && t.sort((function (e, t) {
                            return e.time - t.time
                          }));
                          for (var r = this.arrDim, i = t.length, n = t[i - 1], a = 0; a < i; a++) t[a].percent = t[a].time / this.maxTime, r > 0 && a !== i - 1 && Oa(t[a].value, n.value, r);
                          if (e && this.needsAnimate() && e.needsAnimate() && r === e.arrDim && this.isValueColor === e.isValueColor && !e._finished) {
                            this._additiveTrack = e;
                            var o = t[0].value;
                            for (a = 0; a < i; a++) 0 === r ? this.isValueColor ? t[a].additiveValue = La([], t[a].value, o, -1) : t[a].additiveValue = t[a].value - o : 1 === r ? t[a].additiveValue = La([], t[a].value, o, -1) : 2 === r && (t[a].additiveValue = Pa([], t[a].value, o, -1))
                          }
                        }, e.prototype.step = function (e, t) {
                          if (!this._finished) {
                            this._additiveTrack && this._additiveTrack._finished && (this._additiveTrack = null);
                            var r, i = null != this._additiveTrack,
                              n = i ? "additiveValue" : "value",
                              a = this.keyframes,
                              o = this.keyframes.length,
                              s = this.propName,
                              l = this.arrDim,
                              h = this.isValueColor;
                            if (t < 0) r = 0;
                            else if (t < this._lastFramePercent) {
                              for (r = Math.min(this._lastFrame + 1, o - 1); r >= 0 && !(a[r].percent <= t); r--);
                              r = Math.min(r, o - 2)
                            } else {
                              for (r = this._lastFrame; r < o && !(a[r].percent > t); r++);
                              r = Math.min(r - 1, o - 2)
                            }
                            var u = a[r + 1],
                              c = a[r];
                            if (c && u) {
                              this._lastFrame = r, this._lastFramePercent = t;
                              var d = u.percent - c.percent;
                              if (0 !== d) {
                                var f = (t - c.percent) / d,
                                  p = i ? this._additiveValue : h ? za : e[s];
                                if ((l > 0 || h) && !p && (p = this._additiveValue = []), this.useSpline) {
                                  var m = a[r][n],
                                    g = a[0 === r ? r : r - 1][n],
                                    _ = a[r > o - 2 ? o - 1 : r + 1][n],
                                    v = a[r > o - 3 ? o - 1 : r + 2][n];
                                  if (l > 0) 1 === l ? Ra(p, g, m, _, v, f, f * f, f * f * f) : function (e, t, r, i, n, a, o, s) {
                                    for (var l = t.length, h = t[0].length, u = 0; u < l; u++) {
                                      e[u] || (e[1] = []);
                                      for (var c = 0; c < h; c++) e[u][c] = Ia(t[u][c], r[u][c], i[u][c], n[u][c], a, o, s)
                                    }
                                  }(p, g, m, _, v, f, f * f, f * f * f);
                                  else if (h) Ra(p, g, m, _, v, f, f * f, f * f * f), i || (e[s] = Fa(p));
                                  else {
                                    var y = void 0;
                                    y = this.interpolable ? Ia(g, m, _, v, f, f * f, f * f * f) : _, i ? this._additiveValue = y : e[s] = y
                                  }
                                } else l > 0 ? 1 === l ? Da(p, c[n], u[n], f) : function (e, t, r, i) {
                                  for (var n = t.length, a = n && t[0].length, o = 0; o < n; o++) {
                                    e[o] || (e[o] = []);
                                    for (var s = 0; s < a; s++) e[o][s] = Ca(t[o][s], r[o][s], i)
                                  }
                                }(p, c[n], u[n], f) : h ? (Da(p, c[n], u[n], f), i || (e[s] = Fa(p))) : (y = void 0, y = this.interpolable ? Ca(c[n], u[n], f) : function (e, t, r) {
                                  return r > .5 ? t : e
                                }(c[n], u[n], f), i ? this._additiveValue = y : e[s] = y);
                                i && this._addToTarget(e)
                              }
                            }
                          }
                        }, e.prototype._addToTarget = function (e) {
                          var t = this.arrDim,
                            r = this.propName,
                            i = this._additiveValue;
                          0 === t ? this.isValueColor ? (oa(e[r], za), La(za, za, i, 1), e[r] = Fa(za)) : e[r] = e[r] + i : 1 === t ? La(e[r], e[r], i, 1) : 2 === t && Pa(e[r], e[r], i, 1)
                        }, e
                      }();
                    const Ua = function () {
                        function e(e, t, r) {
                          this._tracks = {}, this._trackKeys = [], this._delay = 0, this._maxTime = 0, this._paused = !1, this._started = 0, this._clip = null, this._target = e, this._loop = t, t && r ? function () {
                            for (var e = [], t = 0; t < arguments.length; t++) e[t] = arguments[t];
                            "undefined" != typeof console && console.error.apply(console, e)
                          }("Can' use additive animation on looped animation.") : this._additiveAnimators = r
                        }
                        return e.prototype.getTarget = function () {
                          return this._target
                        }, e.prototype.changeTarget = function (e) {
                          this._target = e
                        }, e.prototype.when = function (e, t) {
                          return this.whenWithKeys(e, t, ba(t))
                        }, e.prototype.whenWithKeys = function (e, t, r) {
                          for (var i = this._tracks, n = 0; n < r.length; n++) {
                            var a = r[n],
                              o = i[a];
                            if (!o) {
                              o = i[a] = new Ga(a);
                              var s = void 0,
                                l = this._getAdditiveTrack(a);
                              if (l) {
                                var h = l.keyframes[l.keyframes.length - 1];
                                s = h && h.value, l.isValueColor && s && (s = Fa(s))
                              } else s = this._target[a];
                              if (null == s) continue;
                              0 !== e && o.addKeyframe(0, Ba(s)), this._trackKeys.push(a)
                            }
                            o.addKeyframe(e, Ba(t[a]))
                          }
                          return this._maxTime = Math.max(this._maxTime, e), this
                        }, e.prototype.pause = function () {
                          this._clip.pause(), this._paused = !0
                        }, e.prototype.resume = function () {
                          this._clip.resume(), this._paused = !1
                        }, e.prototype.isPaused = function () {
                          return !!this._paused
                        }, e.prototype._doneCallback = function () {
                          this._setTracksFinished(), this._clip = null;
                          var e = this._doneList;
                          if (e)
                            for (var t = e.length, r = 0; r < t; r++) e[r].call(this)
                        }, e.prototype._abortedCallback = function () {
                          this._setTracksFinished();
                          var e = this.animation,
                            t = this._abortedList;
                          if (e && e.removeClip(this._clip), this._clip = null, t)
                            for (var r = 0; r < t.length; r++) t[r].call(this)
                        }, e.prototype._setTracksFinished = function () {
                          for (var e = this._tracks, t = this._trackKeys, r = 0; r < t.length; r++) e[t[r]].setFinished()
                        }, e.prototype._getAdditiveTrack = function (e) {
                          var t, r = this._additiveAnimators;
                          if (r)
                            for (var i = 0; i < r.length; i++) {
                              var n = r[i].getTrack(e);
                              n && (t = n)
                            }
                          return t
                        }, e.prototype.start = function (e, t) {
                          if (!(this._started > 0)) {
                            this._started = 1;
                            for (var r = this, i = [], n = 0; n < this._trackKeys.length; n++) {
                              var a = this._trackKeys[n],
                                o = this._tracks[a],
                                s = this._getAdditiveTrack(a),
                                l = o.keyframes;
                              if (o.prepare(s), o.needsAnimate()) i.push(o);
                              else if (!o.interpolable) {
                                var h = l[l.length - 1];
                                h && (r._target[o.propName] = h.value)
                              }
                            }
                            if (i.length || t) {
                              var u = new Zn({
                                life: this._maxTime,
                                loop: this._loop,
                                delay: this._delay,
                                onframe: function (e) {
                                  r._started = 2;
                                  var t = r._additiveAnimators;
                                  if (t) {
                                    for (var n = !1, a = 0; a < t.length; a++)
                                      if (t[a]._clip) {
                                        n = !0;
                                        break
                                      } n || (r._additiveAnimators = null)
                                  }
                                  for (a = 0; a < i.length; a++) i[a].step(r._target, e);
                                  var o = r._onframeList;
                                  if (o)
                                    for (a = 0; a < o.length; a++) o[a](r._target, e)
                                },
                                ondestroy: function () {
                                  r._doneCallback()
                                }
                              });
                              this._clip = u, this.animation && this.animation.addClip(u), e && "spline" !== e && (u.easing = e)
                            } else this._doneCallback();
                            return this
                          }
                        }, e.prototype.stop = function (e) {
                          if (this._clip) {
                            var t = this._clip;
                            e && t.onframe(1), this._abortedCallback()
                          }
                        }, e.prototype.delay = function (e) {
                          return this._delay = e, this
                        }, e.prototype.during = function (e) {
                          return e && (this._onframeList || (this._onframeList = []), this._onframeList.push(e)), this
                        }, e.prototype.done = function (e) {
                          return e && (this._doneList || (this._doneList = []), this._doneList.push(e)), this
                        }, e.prototype.aborted = function (e) {
                          return e && (this._abortedList || (this._abortedList = []), this._abortedList.push(e)), this
                        }, e.prototype.getClip = function () {
                          return this._clip
                        }, e.prototype.getTrack = function (e) {
                          return this._tracks[e]
                        }, e.prototype.stopTracks = function (e, t) {
                          if (!e.length || !this._clip) return !0;
                          for (var r = this._tracks, i = this._trackKeys, n = 0; n < e.length; n++) {
                            var a = r[e[n]];
                            a && (t ? a.step(this._target, 1) : 1 === this._started && a.step(this._target, 0), a.setFinished())
                          }
                          var o = !0;
                          for (n = 0; n < i.length; n++)
                            if (!r[i[n]].isFinished()) {
                              o = !1;
                              break
                            } return o && this._abortedCallback(), o
                        }, e.prototype.saveFinalToTarget = function (e, t) {
                          if (e) {
                            t = t || this._trackKeys;
                            for (var r = 0; r < t.length; r++) {
                              var i = t[r],
                                n = this._tracks[i];
                              if (n && !n.isFinished()) {
                                var a = n.keyframes,
                                  o = a[a.length - 1];
                                if (o) {
                                  var s = Ba(o.value);
                                  n.isValueColor && (s = Fa(s)), e[i] = s
                                }
                              }
                            }
                          }
                        }, e.prototype.__changeFinalValue = function (e, t) {
                          t = t || ba(e);
                          for (var r = 0; r < t.length; r++) {
                            var i = t[r],
                              n = this._tracks[i];
                            if (n) {
                              var a = n.keyframes;
                              if (a.length > 1) {
                                var o = a.pop();
                                n.addKeyframe(o.time, e[i]), n.prepare(n.getAdditiveTrack())
                              }
                            }
                          }
                        }, e
                      }(),
                      ka = {
                        _animators: null,
                        getAnimators: function () {
                          return this._animators = this._animators || [], this._animators
                        },
                        animate: function (e, t) {
                          var r;
                          if (this._animators = this._animators || [], e) {
                            for (var i = e.split("."), n = this, a = 0, o = i.length; a < o; a++) n && (n = n[i[a]]);
                            n && (r = n)
                          } else r = this;
                          if (null == r) throw new Error("Target " + e + " not exists");
                          var s = this._animators,
                            l = new Ua(r, t),
                            h = this;
                          return l.during((function () {
                            h.__zr && h.__zr.refresh()
                          })).done((function () {
                            var e = s.indexOf(l);
                            e >= 0 && s.splice(e, 1)
                          })), s.push(l), this.__zr && this.__zr.animation.addAnimator(l), l
                        },
                        stopAnimation: function (e) {
                          this._animators = this._animators || [];
                          for (var t = this._animators, r = t.length, i = 0; i < r; i++) t[i].stop(e);
                          return t.length = 0, this
                        },
                        addAnimatorsToZr: function (e) {
                          if (this._animators)
                            for (var t = 0; t < this._animators.length; t++) e.animation.addAnimator(this._animators[t])
                        },
                        removeAnimatorsFromZr: function (e) {
                          if (this._animators)
                            for (var t = 0; t < this._animators.length; t++) e.animation.removeAnimator(this._animators[t])
                        }
                      },
                      Va = "\n@export clay.util.rand\nhighp float rand(vec2 uv) {\n const highp float a = 12.9898, b = 78.233, c = 43758.5453;\n highp float dt = dot(uv.xy, vec2(a,b)), sn = mod(dt, 3.141592653589793);\n return fract(sin(sn) * c);\n}\n@end\n@export clay.util.calculate_attenuation\nuniform float attenuationFactor : 5.0;\nfloat lightAttenuation(float dist, float range)\n{\n float attenuation = 1.0;\n attenuation = dist*dist/(range*range+1.0);\n float att_s = attenuationFactor;\n attenuation = 1.0/(attenuation*att_s+1.0);\n att_s = 1.0/(att_s+1.0);\n attenuation = attenuation - att_s;\n attenuation /= 1.0 - att_s;\n return clamp(attenuation, 0.0, 1.0);\n}\n@end\n@export clay.util.edge_factor\n#ifdef SUPPORT_STANDARD_DERIVATIVES\nfloat edgeFactor(float width)\n{\n vec3 d = fwidth(v_Barycentric);\n vec3 a3 = smoothstep(vec3(0.0), d * width, v_Barycentric);\n return min(min(a3.x, a3.y), a3.z);\n}\n#else\nfloat edgeFactor(float width)\n{\n return 1.0;\n}\n#endif\n@end\n@export clay.util.encode_float\nvec4 encodeFloat(const in float depth)\n{\n const vec4 bitShifts = vec4(256.0*256.0*256.0, 256.0*256.0, 256.0, 1.0);\n const vec4 bit_mask = vec4(0.0, 1.0/256.0, 1.0/256.0, 1.0/256.0);\n vec4 res = fract(depth * bitShifts);\n res -= res.xxyz * bit_mask;\n return res;\n}\n@end\n@export clay.util.decode_float\nfloat decodeFloat(const in vec4 color)\n{\n const vec4 bitShifts = vec4(1.0/(256.0*256.0*256.0), 1.0/(256.0*256.0), 1.0/256.0, 1.0);\n return dot(color, bitShifts);\n}\n@end\n@export clay.util.float\n@import clay.util.encode_float\n@import clay.util.decode_float\n@end\n@export clay.util.rgbm_decode\nvec3 RGBMDecode(vec4 rgbm, float range) {\n return range * rgbm.rgb * rgbm.a;\n}\n@end\n@export clay.util.rgbm_encode\nvec4 RGBMEncode(vec3 color, float range) {\n if (dot(color, color) == 0.0) {\n return vec4(0.0);\n }\n vec4 rgbm;\n color /= range;\n rgbm.a = clamp(max(max(color.r, color.g), max(color.b, 1e-6)), 0.0, 1.0);\n rgbm.a = ceil(rgbm.a * 255.0) / 255.0;\n rgbm.rgb = color / rgbm.a;\n return rgbm;\n}\n@end\n@export clay.util.rgbm\n@import clay.util.rgbm_decode\n@import clay.util.rgbm_encode\nvec4 decodeHDR(vec4 color)\n{\n#if defined(RGBM_DECODE) || defined(RGBM)\n return vec4(RGBMDecode(color, 8.12), 1.0);\n#else\n return color;\n#endif\n}\nvec4 encodeHDR(vec4 color)\n{\n#if defined(RGBM_ENCODE) || defined(RGBM)\n return RGBMEncode(color.xyz, 8.12);\n#else\n return color;\n#endif\n}\n@end\n@export clay.util.srgb\nvec4 sRGBToLinear(in vec4 value) {\n return vec4(mix(pow(value.rgb * 0.9478672986 + vec3(0.0521327014), vec3(2.4)), value.rgb * 0.0773993808, vec3(lessThanEqual(value.rgb, vec3(0.04045)))), value.w);\n}\nvec4 linearTosRGB(in vec4 value) {\n return vec4(mix(pow(value.rgb, vec3(0.41666)) * 1.055 - vec3(0.055), value.rgb * 12.92, vec3(lessThanEqual(value.rgb, vec3(0.0031308)))), value.w);\n}\n@end\n@export clay.chunk.skinning_header\n#ifdef SKINNING\nattribute vec3 weight : WEIGHT;\nattribute vec4 joint : JOINT;\n#ifdef USE_SKIN_MATRICES_TEXTURE\nuniform sampler2D skinMatricesTexture : ignore;\nuniform float skinMatricesTextureSize: ignore;\nmat4 getSkinMatrix(sampler2D tex, float idx) {\n float j = idx * 4.0;\n float x = mod(j, skinMatricesTextureSize);\n float y = floor(j / skinMatricesTextureSize) + 0.5;\n vec2 scale = vec2(skinMatricesTextureSize);\n return mat4(\n texture2D(tex, vec2(x + 0.5, y) / scale),\n texture2D(tex, vec2(x + 1.5, y) / scale),\n texture2D(tex, vec2(x + 2.5, y) / scale),\n texture2D(tex, vec2(x + 3.5, y) / scale)\n );\n}\nmat4 getSkinMatrix(float idx) {\n return getSkinMatrix(skinMatricesTexture, idx);\n}\n#else\nuniform mat4 skinMatrix[JOINT_COUNT] : SKIN_MATRIX;\nmat4 getSkinMatrix(float idx) {\n return skinMatrix[int(idx)];\n}\n#endif\n#endif\n@end\n@export clay.chunk.skin_matrix\nmat4 skinMatrixWS = getSkinMatrix(joint.x) * weight.x;\nif (weight.y > 1e-4)\n{\n skinMatrixWS += getSkinMatrix(joint.y) * weight.y;\n}\nif (weight.z > 1e-4)\n{\n skinMatrixWS += getSkinMatrix(joint.z) * weight.z;\n}\nfloat weightW = 1.0-weight.x-weight.y-weight.z;\nif (weightW > 1e-4)\n{\n skinMatrixWS += getSkinMatrix(joint.w) * weightW;\n}\n@end\n@export clay.chunk.instancing_header\n#ifdef INSTANCING\nattribute vec4 instanceMat1;\nattribute vec4 instanceMat2;\nattribute vec4 instanceMat3;\n#endif\n@end\n@export clay.chunk.instancing_matrix\nmat4 instanceMat = mat4(\n vec4(instanceMat1.xyz, 0.0),\n vec4(instanceMat2.xyz, 0.0),\n vec4(instanceMat3.xyz, 0.0),\n vec4(instanceMat1.w, instanceMat2.w, instanceMat3.w, 1.0)\n);\n@end\n@export clay.util.parallax_correct\nvec3 parallaxCorrect(in vec3 dir, in vec3 pos, in vec3 boxMin, in vec3 boxMax) {\n vec3 first = (boxMax - pos) / dir;\n vec3 second = (boxMin - pos) / dir;\n vec3 further = max(first, second);\n float dist = min(further.x, min(further.y, further.z));\n vec3 fixedPos = pos + dir * dist;\n vec3 boxCenter = (boxMax + boxMin) * 0.5;\n return normalize(fixedPos - boxCenter);\n}\n@end\n@export clay.util.clamp_sample\nvec4 clampSample(const in sampler2D texture, const in vec2 coord)\n{\n#ifdef STEREO\n float eye = step(0.5, coord.x) * 0.5;\n vec2 coordClamped = clamp(coord, vec2(eye, 0.0), vec2(0.5 + eye, 1.0));\n#else\n vec2 coordClamped = clamp(coord, vec2(0.0), vec2(1.0));\n#endif\n return texture2D(texture, coordClamped);\n}\n@end\n@export clay.util.ACES\nvec3 ACESToneMapping(vec3 color)\n{\n const float A = 2.51;\n const float B = 0.03;\n const float C = 2.43;\n const float D = 0.59;\n const float E = 0.14;\n return (color * (A * color + B)) / (color * (C * color + D) + E);\n}\n@end";

                    function Ha(e) {
                      return e instanceof HTMLCanvasElement || e instanceof HTMLImageElement || e instanceof Image
                    }
                    Object.assign(sr.prototype, ka), Xe.import(Va), Xe.import(qe), Xe.import("\n@export ecgl.common.transformUniforms\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\nuniform mat4 worldInverseTranspose : WORLDINVERSETRANSPOSE;\nuniform mat4 world : WORLD;\n@end\n\n@export ecgl.common.attributes\nattribute vec3 position : POSITION;\nattribute vec2 texcoord : TEXCOORD_0;\nattribute vec3 normal : NORMAL;\n@end\n\n@export ecgl.common.uv.header\nuniform vec2 uvRepeat : [1.0, 1.0];\nuniform vec2 uvOffset : [0.0, 0.0];\nuniform vec2 detailUvRepeat : [1.0, 1.0];\nuniform vec2 detailUvOffset : [0.0, 0.0];\n\nvarying vec2 v_Texcoord;\nvarying vec2 v_DetailTexcoord;\n@end\n\n@export ecgl.common.uv.main\nv_Texcoord = texcoord * uvRepeat + uvOffset;\nv_DetailTexcoord = texcoord * detailUvRepeat + detailUvOffset;\n@end\n\n@export ecgl.common.uv.fragmentHeader\nvarying vec2 v_Texcoord;\nvarying vec2 v_DetailTexcoord;\n@end\n\n\n@export ecgl.common.albedo.main\n\n vec4 albedoTexel = vec4(1.0);\n#ifdef DIFFUSEMAP_ENABLED\n albedoTexel = texture2D(diffuseMap, v_Texcoord);\n #ifdef SRGB_DECODE\n albedoTexel = sRGBToLinear(albedoTexel);\n #endif\n#endif\n\n#ifdef DETAILMAP_ENABLED\n vec4 detailTexel = texture2D(detailMap, v_DetailTexcoord);\n #ifdef SRGB_DECODE\n detailTexel = sRGBToLinear(detailTexel);\n #endif\n albedoTexel.rgb = mix(albedoTexel.rgb, detailTexel.rgb, detailTexel.a);\n albedoTexel.a = detailTexel.a + (1.0 - detailTexel.a) * albedoTexel.a;\n#endif\n\n@end\n\n@export ecgl.common.wireframe.vertexHeader\n\n#ifdef WIREFRAME_QUAD\nattribute vec4 barycentric;\nvarying vec4 v_Barycentric;\n#elif defined(WIREFRAME_TRIANGLE)\nattribute vec3 barycentric;\nvarying vec3 v_Barycentric;\n#endif\n\n@end\n\n@export ecgl.common.wireframe.vertexMain\n\n#if defined(WIREFRAME_QUAD) || defined(WIREFRAME_TRIANGLE)\n v_Barycentric = barycentric;\n#endif\n\n@end\n\n\n@export ecgl.common.wireframe.fragmentHeader\n\nuniform float wireframeLineWidth : 1;\nuniform vec4 wireframeLineColor: [0, 0, 0, 0.5];\n\n#ifdef WIREFRAME_QUAD\nvarying vec4 v_Barycentric;\nfloat edgeFactor () {\n vec4 d = fwidth(v_Barycentric);\n vec4 a4 = smoothstep(vec4(0.0), d * wireframeLineWidth, v_Barycentric);\n return min(min(min(a4.x, a4.y), a4.z), a4.w);\n}\n#elif defined(WIREFRAME_TRIANGLE)\nvarying vec3 v_Barycentric;\nfloat edgeFactor () {\n vec3 d = fwidth(v_Barycentric);\n vec3 a3 = smoothstep(vec3(0.0), d * wireframeLineWidth, v_Barycentric);\n return min(min(a3.x, a3.y), a3.z);\n}\n#endif\n\n@end\n\n\n@export ecgl.common.wireframe.fragmentMain\n\n#if defined(WIREFRAME_QUAD) || defined(WIREFRAME_TRIANGLE)\n if (wireframeLineWidth > 0.) {\n vec4 lineColor = wireframeLineColor;\n#ifdef SRGB_DECODE\n lineColor = sRGBToLinear(lineColor);\n#endif\n\n gl_FragColor.rgb = mix(gl_FragColor.rgb, lineColor.rgb, (1.0 - edgeFactor()) * lineColor.a);\n }\n#endif\n@end\n\n\n\n\n@export ecgl.common.bumpMap.header\n\n#ifdef BUMPMAP_ENABLED\nuniform sampler2D bumpMap;\nuniform float bumpScale : 1.0;\n\n\nvec3 bumpNormal(vec3 surfPos, vec3 surfNormal, vec3 baseNormal)\n{\n vec2 dSTdx = dFdx(v_Texcoord);\n vec2 dSTdy = dFdy(v_Texcoord);\n\n float Hll = bumpScale * texture2D(bumpMap, v_Texcoord).x;\n float dHx = bumpScale * texture2D(bumpMap, v_Texcoord + dSTdx).x - Hll;\n float dHy = bumpScale * texture2D(bumpMap, v_Texcoord + dSTdy).x - Hll;\n\n vec3 vSigmaX = dFdx(surfPos);\n vec3 vSigmaY = dFdy(surfPos);\n vec3 vN = surfNormal;\n\n vec3 R1 = cross(vSigmaY, vN);\n vec3 R2 = cross(vN, vSigmaX);\n\n float fDet = dot(vSigmaX, R1);\n\n vec3 vGrad = sign(fDet) * (dHx * R1 + dHy * R2);\n return normalize(abs(fDet) * baseNormal - vGrad);\n\n}\n#endif\n\n@end\n\n@export ecgl.common.normalMap.vertexHeader\n\n#ifdef NORMALMAP_ENABLED\nattribute vec4 tangent : TANGENT;\nvarying vec3 v_Tangent;\nvarying vec3 v_Bitangent;\n#endif\n\n@end\n\n@export ecgl.common.normalMap.vertexMain\n\n#ifdef NORMALMAP_ENABLED\n if (dot(tangent, tangent) > 0.0) {\n v_Tangent = normalize((worldInverseTranspose * vec4(tangent.xyz, 0.0)).xyz);\n v_Bitangent = normalize(cross(v_Normal, v_Tangent) * tangent.w);\n }\n#endif\n\n@end\n\n\n@export ecgl.common.normalMap.fragmentHeader\n\n#ifdef NORMALMAP_ENABLED\nuniform sampler2D normalMap;\nvarying vec3 v_Tangent;\nvarying vec3 v_Bitangent;\n#endif\n\n@end\n\n@export ecgl.common.normalMap.fragmentMain\n#ifdef NORMALMAP_ENABLED\n if (dot(v_Tangent, v_Tangent) > 0.0) {\n vec3 normalTexel = texture2D(normalMap, v_DetailTexcoord).xyz;\n if (dot(normalTexel, normalTexel) > 0.0) { N = normalTexel * 2.0 - 1.0;\n mat3 tbn = mat3(v_Tangent, v_Bitangent, v_Normal);\n N = normalize(tbn * N);\n }\n }\n#endif\n@end\n\n\n\n@export ecgl.common.vertexAnimation.header\n\n#ifdef VERTEX_ANIMATION\nattribute vec3 prevPosition;\nattribute vec3 prevNormal;\nuniform float percent;\n#endif\n\n@end\n\n@export ecgl.common.vertexAnimation.main\n\n#ifdef VERTEX_ANIMATION\n vec3 pos = mix(prevPosition, position, percent);\n vec3 norm = mix(prevNormal, normal, percent);\n#else\n vec3 pos = position;\n vec3 norm = normal;\n#endif\n\n@end\n\n\n@export ecgl.common.ssaoMap.header\n#ifdef SSAOMAP_ENABLED\nuniform sampler2D ssaoMap;\nuniform vec4 viewport : VIEWPORT;\n#endif\n@end\n\n@export ecgl.common.ssaoMap.main\n float ao = 1.0;\n#ifdef SSAOMAP_ENABLED\n ao = texture2D(ssaoMap, (gl_FragCoord.xy - viewport.xy) / viewport.zw).r;\n#endif\n@end\n\n\n\n\n@export ecgl.common.diffuseLayer.header\n\n#if (LAYER_DIFFUSEMAP_COUNT > 0)\nuniform float layerDiffuseIntensity[LAYER_DIFFUSEMAP_COUNT];\nuniform sampler2D layerDiffuseMap[LAYER_DIFFUSEMAP_COUNT];\n#endif\n\n@end\n\n@export ecgl.common.emissiveLayer.header\n\n#if (LAYER_EMISSIVEMAP_COUNT > 0)\nuniform float layerEmissionIntensity[LAYER_EMISSIVEMAP_COUNT];\nuniform sampler2D layerEmissiveMap[LAYER_EMISSIVEMAP_COUNT];\n#endif\n\n@end\n\n@export ecgl.common.layers.header\n@import ecgl.common.diffuseLayer.header\n@import ecgl.common.emissiveLayer.header\n@end\n\n@export ecgl.common.diffuseLayer.main\n\n#if (LAYER_DIFFUSEMAP_COUNT > 0)\n for (int _idx_ = 0; _idx_ < LAYER_DIFFUSEMAP_COUNT; _idx_++) {{\n float intensity = layerDiffuseIntensity[_idx_];\n vec4 texel2 = texture2D(layerDiffuseMap[_idx_], v_Texcoord);\n #ifdef SRGB_DECODE\n texel2 = sRGBToLinear(texel2);\n #endif\n albedoTexel.rgb = mix(albedoTexel.rgb, texel2.rgb * intensity, texel2.a);\n albedoTexel.a = texel2.a + (1.0 - texel2.a) * albedoTexel.a;\n }}\n#endif\n\n@end\n\n@export ecgl.common.emissiveLayer.main\n\n#if (LAYER_EMISSIVEMAP_COUNT > 0)\n for (int _idx_ = 0; _idx_ < LAYER_EMISSIVEMAP_COUNT; _idx_++)\n {{\n vec4 texel2 = texture2D(layerEmissiveMap[_idx_], v_Texcoord) * layerEmissionIntensity[_idx_];\n #ifdef SRGB_DECODE\n texel2 = sRGBToLinear(texel2);\n #endif\n float intensity = layerEmissionIntensity[_idx_];\n gl_FragColor.rgb += texel2.rgb * texel2.a * intensity;\n }}\n#endif\n\n@end\n"), Xe.import("@export ecgl.color.vertex\n\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\n\n@import ecgl.common.uv.header\n\nattribute vec2 texcoord : TEXCOORD_0;\nattribute vec3 position: POSITION;\n\n@import ecgl.common.wireframe.vertexHeader\n\n#ifdef VERTEX_COLOR\nattribute vec4 a_Color : COLOR;\nvarying vec4 v_Color;\n#endif\n\n#ifdef VERTEX_ANIMATION\nattribute vec3 prevPosition;\nuniform float percent : 1.0;\n#endif\n\n#ifdef ATMOSPHERE_ENABLED\nattribute vec3 normal: NORMAL;\nuniform mat4 worldInverseTranspose : WORLDINVERSETRANSPOSE;\nvarying vec3 v_Normal;\n#endif\n\nvoid main()\n{\n#ifdef VERTEX_ANIMATION\n vec3 pos = mix(prevPosition, position, percent);\n#else\n vec3 pos = position;\n#endif\n\n gl_Position = worldViewProjection * vec4(pos, 1.0);\n\n @import ecgl.common.uv.main\n\n#ifdef VERTEX_COLOR\n v_Color = a_Color;\n#endif\n\n#ifdef ATMOSPHERE_ENABLED\n v_Normal = normalize((worldInverseTranspose * vec4(normal, 0.0)).xyz);\n#endif\n\n @import ecgl.common.wireframe.vertexMain\n\n}\n\n@end\n\n@export ecgl.color.fragment\n\n#define LAYER_DIFFUSEMAP_COUNT 0\n#define LAYER_EMISSIVEMAP_COUNT 0\n\nuniform sampler2D diffuseMap;\nuniform sampler2D detailMap;\n\nuniform vec4 color : [1.0, 1.0, 1.0, 1.0];\n\n#ifdef ATMOSPHERE_ENABLED\nuniform mat4 viewTranspose: VIEWTRANSPOSE;\nuniform vec3 glowColor;\nuniform float glowPower;\nvarying vec3 v_Normal;\n#endif\n\n#ifdef VERTEX_COLOR\nvarying vec4 v_Color;\n#endif\n\n@import ecgl.common.layers.header\n\n@import ecgl.common.uv.fragmentHeader\n\n@import ecgl.common.wireframe.fragmentHeader\n\n@import clay.util.srgb\n\nvoid main()\n{\n#ifdef SRGB_DECODE\n gl_FragColor = sRGBToLinear(color);\n#else\n gl_FragColor = color;\n#endif\n\n#ifdef VERTEX_COLOR\n gl_FragColor *= v_Color;\n#endif\n\n @import ecgl.common.albedo.main\n\n @import ecgl.common.diffuseLayer.main\n\n gl_FragColor *= albedoTexel;\n\n#ifdef ATMOSPHERE_ENABLED\n float atmoIntensity = pow(1.0 - dot(v_Normal, (viewTranspose * vec4(0.0, 0.0, 1.0, 0.0)).xyz), glowPower);\n gl_FragColor.rgb += glowColor * atmoIntensity;\n#endif\n\n @import ecgl.common.emissiveLayer.main\n\n @import ecgl.common.wireframe.fragmentMain\n\n}\n@end"), Xe.import("/**\n * http: */\n\n@export ecgl.lambert.vertex\n\n@import ecgl.common.transformUniforms\n\n@import ecgl.common.uv.header\n\n\n@import ecgl.common.attributes\n\n@import ecgl.common.wireframe.vertexHeader\n\n#ifdef VERTEX_COLOR\nattribute vec4 a_Color : COLOR;\nvarying vec4 v_Color;\n#endif\n\n\n@import ecgl.common.vertexAnimation.header\n\n\nvarying vec3 v_Normal;\nvarying vec3 v_WorldPosition;\n\nvoid main()\n{\n @import ecgl.common.uv.main\n\n @import ecgl.common.vertexAnimation.main\n\n\n gl_Position = worldViewProjection * vec4(pos, 1.0);\n\n v_Normal = normalize((worldInverseTranspose * vec4(norm, 0.0)).xyz);\n v_WorldPosition = (world * vec4(pos, 1.0)).xyz;\n\n#ifdef VERTEX_COLOR\n v_Color = a_Color;\n#endif\n\n @import ecgl.common.wireframe.vertexMain\n}\n\n@end\n\n\n@export ecgl.lambert.fragment\n\n#define LAYER_DIFFUSEMAP_COUNT 0\n#define LAYER_EMISSIVEMAP_COUNT 0\n\n#define NORMAL_UP_AXIS 1\n#define NORMAL_FRONT_AXIS 2\n\n@import ecgl.common.uv.fragmentHeader\n\nvarying vec3 v_Normal;\nvarying vec3 v_WorldPosition;\n\nuniform sampler2D diffuseMap;\nuniform sampler2D detailMap;\n\n@import ecgl.common.layers.header\n\nuniform float emissionIntensity: 1.0;\n\nuniform vec4 color : [1.0, 1.0, 1.0, 1.0];\n\nuniform mat4 viewInverse : VIEWINVERSE;\n\n#ifdef ATMOSPHERE_ENABLED\nuniform mat4 viewTranspose: VIEWTRANSPOSE;\nuniform vec3 glowColor;\nuniform float glowPower;\n#endif\n\n#ifdef AMBIENT_LIGHT_COUNT\n@import clay.header.ambient_light\n#endif\n#ifdef AMBIENT_SH_LIGHT_COUNT\n@import clay.header.ambient_sh_light\n#endif\n\n#ifdef DIRECTIONAL_LIGHT_COUNT\n@import clay.header.directional_light\n#endif\n\n#ifdef VERTEX_COLOR\nvarying vec4 v_Color;\n#endif\n\n\n@import ecgl.common.ssaoMap.header\n\n@import ecgl.common.bumpMap.header\n\n@import clay.util.srgb\n\n@import ecgl.common.wireframe.fragmentHeader\n\n@import clay.plugin.compute_shadow_map\n\nvoid main()\n{\n#ifdef SRGB_DECODE\n gl_FragColor = sRGBToLinear(color);\n#else\n gl_FragColor = color;\n#endif\n\n#ifdef VERTEX_COLOR\n #ifdef SRGB_DECODE\n gl_FragColor *= sRGBToLinear(v_Color);\n #else\n gl_FragColor *= v_Color;\n #endif\n#endif\n\n @import ecgl.common.albedo.main\n\n @import ecgl.common.diffuseLayer.main\n\n gl_FragColor *= albedoTexel;\n\n vec3 N = v_Normal;\n#ifdef DOUBLE_SIDED\n vec3 eyePos = viewInverse[3].xyz;\n vec3 V = normalize(eyePos - v_WorldPosition);\n\n if (dot(N, V) < 0.0) {\n N = -N;\n }\n#endif\n\n float ambientFactor = 1.0;\n\n#ifdef BUMPMAP_ENABLED\n N = bumpNormal(v_WorldPosition, v_Normal, N);\n ambientFactor = dot(v_Normal, N);\n#endif\n\n vec3 N2 = vec3(N.x, N[NORMAL_UP_AXIS], N[NORMAL_FRONT_AXIS]);\n\n vec3 diffuseColor = vec3(0.0, 0.0, 0.0);\n\n @import ecgl.common.ssaoMap.main\n\n#ifdef AMBIENT_LIGHT_COUNT\n for(int i = 0; i < AMBIENT_LIGHT_COUNT; i++)\n {\n diffuseColor += ambientLightColor[i] * ambientFactor * ao;\n }\n#endif\n#ifdef AMBIENT_SH_LIGHT_COUNT\n for(int _idx_ = 0; _idx_ < AMBIENT_SH_LIGHT_COUNT; _idx_++)\n {{\n diffuseColor += calcAmbientSHLight(_idx_, N2) * ambientSHLightColor[_idx_] * ao;\n }}\n#endif\n#ifdef DIRECTIONAL_LIGHT_COUNT\n#if defined(DIRECTIONAL_LIGHT_SHADOWMAP_COUNT)\n float shadowContribsDir[DIRECTIONAL_LIGHT_COUNT];\n if(shadowEnabled)\n {\n computeShadowOfDirectionalLights(v_WorldPosition, shadowContribsDir);\n }\n#endif\n for(int i = 0; i < DIRECTIONAL_LIGHT_COUNT; i++)\n {\n vec3 lightDirection = -directionalLightDirection[i];\n vec3 lightColor = directionalLightColor[i];\n\n float shadowContrib = 1.0;\n#if defined(DIRECTIONAL_LIGHT_SHADOWMAP_COUNT)\n if (shadowEnabled)\n {\n shadowContrib = shadowContribsDir[i];\n }\n#endif\n\n float ndl = dot(N, normalize(lightDirection)) * shadowContrib;\n\n diffuseColor += lightColor * clamp(ndl, 0.0, 1.0);\n }\n#endif\n\n gl_FragColor.rgb *= diffuseColor;\n\n#ifdef ATMOSPHERE_ENABLED\n float atmoIntensity = pow(1.0 - dot(v_Normal, (viewTranspose * vec4(0.0, 0.0, 1.0, 0.0)).xyz), glowPower);\n gl_FragColor.rgb += glowColor * atmoIntensity;\n#endif\n\n @import ecgl.common.emissiveLayer.main\n\n @import ecgl.common.wireframe.fragmentMain\n}\n\n@end"), Xe.import("@export ecgl.realistic.vertex\n\n@import ecgl.common.transformUniforms\n\n@import ecgl.common.uv.header\n\n@import ecgl.common.attributes\n\n\n@import ecgl.common.wireframe.vertexHeader\n\n#ifdef VERTEX_COLOR\nattribute vec4 a_Color : COLOR;\nvarying vec4 v_Color;\n#endif\n\n#ifdef NORMALMAP_ENABLED\nattribute vec4 tangent : TANGENT;\nvarying vec3 v_Tangent;\nvarying vec3 v_Bitangent;\n#endif\n\n@import ecgl.common.vertexAnimation.header\n\nvarying vec3 v_Normal;\nvarying vec3 v_WorldPosition;\n\nvoid main()\n{\n\n @import ecgl.common.uv.main\n\n @import ecgl.common.vertexAnimation.main\n\n gl_Position = worldViewProjection * vec4(pos, 1.0);\n\n v_Normal = normalize((worldInverseTranspose * vec4(norm, 0.0)).xyz);\n v_WorldPosition = (world * vec4(pos, 1.0)).xyz;\n\n#ifdef VERTEX_COLOR\n v_Color = a_Color;\n#endif\n\n#ifdef NORMALMAP_ENABLED\n v_Tangent = normalize((worldInverseTranspose * vec4(tangent.xyz, 0.0)).xyz);\n v_Bitangent = normalize(cross(v_Normal, v_Tangent) * tangent.w);\n#endif\n\n @import ecgl.common.wireframe.vertexMain\n\n}\n\n@end\n\n\n\n@export ecgl.realistic.fragment\n\n#define LAYER_DIFFUSEMAP_COUNT 0\n#define LAYER_EMISSIVEMAP_COUNT 0\n#define PI 3.14159265358979\n#define ROUGHNESS_CHANEL 0\n#define METALNESS_CHANEL 1\n\n#define NORMAL_UP_AXIS 1\n#define NORMAL_FRONT_AXIS 2\n\n#ifdef VERTEX_COLOR\nvarying vec4 v_Color;\n#endif\n\n@import ecgl.common.uv.fragmentHeader\n\nvarying vec3 v_Normal;\nvarying vec3 v_WorldPosition;\n\nuniform sampler2D diffuseMap;\n\nuniform sampler2D detailMap;\nuniform sampler2D metalnessMap;\nuniform sampler2D roughnessMap;\n\n@import ecgl.common.layers.header\n\nuniform float emissionIntensity: 1.0;\n\nuniform vec4 color : [1.0, 1.0, 1.0, 1.0];\n\nuniform float metalness : 0.0;\nuniform float roughness : 0.5;\n\nuniform mat4 viewInverse : VIEWINVERSE;\n\n#ifdef ATMOSPHERE_ENABLED\nuniform mat4 viewTranspose: VIEWTRANSPOSE;\nuniform vec3 glowColor;\nuniform float glowPower;\n#endif\n\n#ifdef AMBIENT_LIGHT_COUNT\n@import clay.header.ambient_light\n#endif\n\n#ifdef AMBIENT_SH_LIGHT_COUNT\n@import clay.header.ambient_sh_light\n#endif\n\n#ifdef AMBIENT_CUBEMAP_LIGHT_COUNT\n@import clay.header.ambient_cubemap_light\n#endif\n\n#ifdef DIRECTIONAL_LIGHT_COUNT\n@import clay.header.directional_light\n#endif\n\n@import ecgl.common.normalMap.fragmentHeader\n\n@import ecgl.common.ssaoMap.header\n\n@import ecgl.common.bumpMap.header\n\n@import clay.util.srgb\n\n@import clay.util.rgbm\n\n@import ecgl.common.wireframe.fragmentHeader\n\n@import clay.plugin.compute_shadow_map\n\nvec3 F_Schlick(float ndv, vec3 spec) {\n return spec + (1.0 - spec) * pow(1.0 - ndv, 5.0);\n}\n\nfloat D_Phong(float g, float ndh) {\n float a = pow(8192.0, g);\n return (a + 2.0) / 8.0 * pow(ndh, a);\n}\n\nvoid main()\n{\n vec4 albedoColor = color;\n\n vec3 eyePos = viewInverse[3].xyz;\n vec3 V = normalize(eyePos - v_WorldPosition);\n#ifdef VERTEX_COLOR\n #ifdef SRGB_DECODE\n albedoColor *= sRGBToLinear(v_Color);\n #else\n albedoColor *= v_Color;\n #endif\n#endif\n\n @import ecgl.common.albedo.main\n\n @import ecgl.common.diffuseLayer.main\n\n albedoColor *= albedoTexel;\n\n float m = metalness;\n\n#ifdef METALNESSMAP_ENABLED\n float m2 = texture2D(metalnessMap, v_DetailTexcoord)[METALNESS_CHANEL];\n m = clamp(m2 + (m - 0.5) * 2.0, 0.0, 1.0);\n#endif\n\n vec3 baseColor = albedoColor.rgb;\n albedoColor.rgb = baseColor * (1.0 - m);\n vec3 specFactor = mix(vec3(0.04), baseColor, m);\n\n float g = 1.0 - roughness;\n\n#ifdef ROUGHNESSMAP_ENABLED\n float g2 = 1.0 - texture2D(roughnessMap, v_DetailTexcoord)[ROUGHNESS_CHANEL];\n g = clamp(g2 + (g - 0.5) * 2.0, 0.0, 1.0);\n#endif\n\n vec3 N = v_Normal;\n\n#ifdef DOUBLE_SIDED\n if (dot(N, V) < 0.0) {\n N = -N;\n }\n#endif\n\n float ambientFactor = 1.0;\n\n#ifdef BUMPMAP_ENABLED\n N = bumpNormal(v_WorldPosition, v_Normal, N);\n ambientFactor = dot(v_Normal, N);\n#endif\n\n@import ecgl.common.normalMap.fragmentMain\n\n vec3 N2 = vec3(N.x, N[NORMAL_UP_AXIS], N[NORMAL_FRONT_AXIS]);\n\n vec3 diffuseTerm = vec3(0.0);\n vec3 specularTerm = vec3(0.0);\n\n float ndv = clamp(dot(N, V), 0.0, 1.0);\n vec3 fresnelTerm = F_Schlick(ndv, specFactor);\n\n @import ecgl.common.ssaoMap.main\n\n#ifdef AMBIENT_LIGHT_COUNT\n for(int _idx_ = 0; _idx_ < AMBIENT_LIGHT_COUNT; _idx_++)\n {{\n diffuseTerm += ambientLightColor[_idx_] * ambientFactor * ao;\n }}\n#endif\n\n#ifdef AMBIENT_SH_LIGHT_COUNT\n for(int _idx_ = 0; _idx_ < AMBIENT_SH_LIGHT_COUNT; _idx_++)\n {{\n diffuseTerm += calcAmbientSHLight(_idx_, N2) * ambientSHLightColor[_idx_] * ao;\n }}\n#endif\n\n#ifdef DIRECTIONAL_LIGHT_COUNT\n#if defined(DIRECTIONAL_LIGHT_SHADOWMAP_COUNT)\n float shadowContribsDir[DIRECTIONAL_LIGHT_COUNT];\n if(shadowEnabled)\n {\n computeShadowOfDirectionalLights(v_WorldPosition, shadowContribsDir);\n }\n#endif\n for(int _idx_ = 0; _idx_ < DIRECTIONAL_LIGHT_COUNT; _idx_++)\n {{\n vec3 L = -directionalLightDirection[_idx_];\n vec3 lc = directionalLightColor[_idx_];\n\n vec3 H = normalize(L + V);\n float ndl = clamp(dot(N, normalize(L)), 0.0, 1.0);\n float ndh = clamp(dot(N, H), 0.0, 1.0);\n\n float shadowContrib = 1.0;\n#if defined(DIRECTIONAL_LIGHT_SHADOWMAP_COUNT)\n if (shadowEnabled)\n {\n shadowContrib = shadowContribsDir[_idx_];\n }\n#endif\n\n vec3 li = lc * ndl * shadowContrib;\n\n diffuseTerm += li;\n specularTerm += li * fresnelTerm * D_Phong(g, ndh);\n }}\n#endif\n\n\n#ifdef AMBIENT_CUBEMAP_LIGHT_COUNT\n vec3 L = reflect(-V, N);\n L = vec3(L.x, L[NORMAL_UP_AXIS], L[NORMAL_FRONT_AXIS]);\n float rough2 = clamp(1.0 - g, 0.0, 1.0);\n float bias2 = rough2 * 5.0;\n vec2 brdfParam2 = texture2D(ambientCubemapLightBRDFLookup[0], vec2(rough2, ndv)).xy;\n vec3 envWeight2 = specFactor * brdfParam2.x + brdfParam2.y;\n vec3 envTexel2;\n for(int _idx_ = 0; _idx_ < AMBIENT_CUBEMAP_LIGHT_COUNT; _idx_++)\n {{\n envTexel2 = RGBMDecode(textureCubeLodEXT(ambientCubemapLightCubemap[_idx_], L, bias2), 8.12);\n specularTerm += ambientCubemapLightColor[_idx_] * envTexel2 * envWeight2 * ao;\n }}\n#endif\n\n gl_FragColor.rgb = albedoColor.rgb * diffuseTerm + specularTerm;\n gl_FragColor.a = albedoColor.a;\n\n#ifdef ATMOSPHERE_ENABLED\n float atmoIntensity = pow(1.0 - dot(v_Normal, (viewTranspose * vec4(0.0, 0.0, 1.0, 0.0)).xyz), glowPower);\n gl_FragColor.rgb += glowColor * atmoIntensity;\n#endif\n\n#ifdef SRGB_ENCODE\n gl_FragColor = linearTosRGB(gl_FragColor);\n#endif\n\n @import ecgl.common.emissiveLayer.main\n\n @import ecgl.common.wireframe.fragmentMain\n}\n\n@end"), Xe.import("@export ecgl.hatching.vertex\n\n@import ecgl.realistic.vertex\n\n@end\n\n\n@export ecgl.hatching.fragment\n\n#define NORMAL_UP_AXIS 1\n#define NORMAL_FRONT_AXIS 2\n\n@import ecgl.common.uv.fragmentHeader\n\nvarying vec3 v_Normal;\nvarying vec3 v_WorldPosition;\n\nuniform vec4 color : [0.0, 0.0, 0.0, 1.0];\nuniform vec4 paperColor : [1.0, 1.0, 1.0, 1.0];\n\nuniform mat4 viewInverse : VIEWINVERSE;\n\n#ifdef AMBIENT_LIGHT_COUNT\n@import clay.header.ambient_light\n#endif\n#ifdef AMBIENT_SH_LIGHT_COUNT\n@import clay.header.ambient_sh_light\n#endif\n\n#ifdef DIRECTIONAL_LIGHT_COUNT\n@import clay.header.directional_light\n#endif\n\n#ifdef VERTEX_COLOR\nvarying vec4 v_Color;\n#endif\n\n\n@import ecgl.common.ssaoMap.header\n\n@import ecgl.common.bumpMap.header\n\n@import clay.util.srgb\n\n@import ecgl.common.wireframe.fragmentHeader\n\n@import clay.plugin.compute_shadow_map\n\nuniform sampler2D hatch1;\nuniform sampler2D hatch2;\nuniform sampler2D hatch3;\nuniform sampler2D hatch4;\nuniform sampler2D hatch5;\nuniform sampler2D hatch6;\n\nfloat shade(in float tone) {\n vec4 c = vec4(1. ,1., 1., 1.);\n float step = 1. / 6.;\n vec2 uv = v_DetailTexcoord;\n if (tone <= step / 2.0) {\n c = mix(vec4(0.), texture2D(hatch6, uv), 12. * tone);\n }\n else if (tone <= step) {\n c = mix(texture2D(hatch6, uv), texture2D(hatch5, uv), 6. * tone);\n }\n if(tone > step && tone <= 2. * step){\n c = mix(texture2D(hatch5, uv), texture2D(hatch4, uv) , 6. * (tone - step));\n }\n if(tone > 2. * step && tone <= 3. * step){\n c = mix(texture2D(hatch4, uv), texture2D(hatch3, uv), 6. * (tone - 2. * step));\n }\n if(tone > 3. * step && tone <= 4. * step){\n c = mix(texture2D(hatch3, uv), texture2D(hatch2, uv), 6. * (tone - 3. * step));\n }\n if(tone > 4. * step && tone <= 5. * step){\n c = mix(texture2D(hatch2, uv), texture2D(hatch1, uv), 6. * (tone - 4. * step));\n }\n if(tone > 5. * step){\n c = mix(texture2D(hatch1, uv), vec4(1.), 6. * (tone - 5. * step));\n }\n\n return c.r;\n}\n\nconst vec3 w = vec3(0.2125, 0.7154, 0.0721);\n\nvoid main()\n{\n#ifdef SRGB_DECODE\n vec4 inkColor = sRGBToLinear(color);\n#else\n vec4 inkColor = color;\n#endif\n\n#ifdef VERTEX_COLOR\n #ifdef SRGB_DECODE\n inkColor *= sRGBToLinear(v_Color);\n #else\n inkColor *= v_Color;\n #endif\n#endif\n\n vec3 N = v_Normal;\n#ifdef DOUBLE_SIDED\n vec3 eyePos = viewInverse[3].xyz;\n vec3 V = normalize(eyePos - v_WorldPosition);\n\n if (dot(N, V) < 0.0) {\n N = -N;\n }\n#endif\n\n float tone = 0.0;\n\n float ambientFactor = 1.0;\n\n#ifdef BUMPMAP_ENABLED\n N = bumpNormal(v_WorldPosition, v_Normal, N);\n ambientFactor = dot(v_Normal, N);\n#endif\n\n vec3 N2 = vec3(N.x, N[NORMAL_UP_AXIS], N[NORMAL_FRONT_AXIS]);\n\n @import ecgl.common.ssaoMap.main\n\n#ifdef AMBIENT_LIGHT_COUNT\n for(int i = 0; i < AMBIENT_LIGHT_COUNT; i++)\n {\n tone += dot(ambientLightColor[i], w) * ambientFactor * ao;\n }\n#endif\n#ifdef AMBIENT_SH_LIGHT_COUNT\n for(int _idx_ = 0; _idx_ < AMBIENT_SH_LIGHT_COUNT; _idx_++)\n {{\n tone += dot(calcAmbientSHLight(_idx_, N2) * ambientSHLightColor[_idx_], w) * ao;\n }}\n#endif\n#ifdef DIRECTIONAL_LIGHT_COUNT\n#if defined(DIRECTIONAL_LIGHT_SHADOWMAP_COUNT)\n float shadowContribsDir[DIRECTIONAL_LIGHT_COUNT];\n if(shadowEnabled)\n {\n computeShadowOfDirectionalLights(v_WorldPosition, shadowContribsDir);\n }\n#endif\n for(int i = 0; i < DIRECTIONAL_LIGHT_COUNT; i++)\n {\n vec3 lightDirection = -directionalLightDirection[i];\n float lightTone = dot(directionalLightColor[i], w);\n\n float shadowContrib = 1.0;\n#if defined(DIRECTIONAL_LIGHT_SHADOWMAP_COUNT)\n if (shadowEnabled)\n {\n shadowContrib = shadowContribsDir[i];\n }\n#endif\n\n float ndl = dot(N, normalize(lightDirection)) * shadowContrib;\n\n tone += lightTone * clamp(ndl, 0.0, 1.0);\n }\n#endif\n\n gl_FragColor = mix(inkColor, paperColor, shade(clamp(tone, 0.0, 1.0)));\n }\n@end\n"), Xe.import("@export ecgl.sm.depth.vertex\n\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\n\nattribute vec3 position : POSITION;\nattribute vec2 texcoord : TEXCOORD_0;\n\n#ifdef VERTEX_ANIMATION\nattribute vec3 prevPosition;\nuniform float percent : 1.0;\n#endif\n\nvarying vec4 v_ViewPosition;\nvarying vec2 v_Texcoord;\n\nvoid main(){\n\n#ifdef VERTEX_ANIMATION\n vec3 pos = mix(prevPosition, position, percent);\n#else\n vec3 pos = position;\n#endif\n\n v_ViewPosition = worldViewProjection * vec4(pos, 1.0);\n gl_Position = v_ViewPosition;\n\n v_Texcoord = texcoord;\n\n}\n@end\n\n\n\n@export ecgl.sm.depth.fragment\n\n@import clay.sm.depth.fragment\n\n@end");
                    var Wa = vi.prototype.addToScene,
                      ja = vi.prototype.removeFromScene;
                    vi.prototype.addToScene = function (e) {
                      if (Wa.call(this, e), this.__zr) {
                        var t = this.__zr;
                        e.traverse((function (e) {
                          e.__zr = t, e.addAnimatorsToZr && e.addAnimatorsToZr(t)
                        }))
                      }
                    }, vi.prototype.removeFromScene = function (e) {
                      ja.call(this, e), e.traverse((function (e) {
                        var t = e.__zr;
                        e.__zr = null, t && e.removeAnimatorsFromZr && e.removeAnimatorsFromZr(t)
                      }))
                    }, le.prototype.setTextureImage = function (e, t, r, i) {
                      if (this.shader) {
                        var n, a = r.getZr(),
                          o = this;
                        return o.autoUpdateTextureStatus = !1, o.disableTexture(e), !(s = t) || "none" === s || (n = Xa.loadTexture(t, r, i, (function (t) {
                          o.enableTexture(e), a && a.refresh()
                        })), o.set(e, n)), n
                      }
                      var s
                    };
                    var Xa = {};
                    Xa.Renderer = ut, Xa.Node = sr, Xa.Mesh = Sr, Xa.Shader = Xe, Xa.Material = le, Xa.Texture = wr, Xa.Texture2D = Dr, Xa.Geometry = Vr, Xa.SphereGeometry = En, Xa.PlaneGeometry = ki, Xa.CubeGeometry = Wi, Xa.AmbientLight = Cn, Xa.DirectionalLight = Dn, Xa.PointLight = Ln, Xa.SpotLight = Pn, Xa.PerspectiveCamera = Ei, Xa.OrthographicCamera = un, Xa.Vector2 = _e, Xa.Vector3 = vt, Xa.Vector4 = Rn, Xa.Quaternion = qt, Xa.Matrix2 = Gn, Xa.Matrix2d = Hn, Xa.Matrix3 = jn, Xa.Matrix4 = Ht, Xa.Plane = $r, Xa.Ray = Mt, Xa.BoundingBox = ir, Xa.Frustum = si;
                    var qa = null;

                    function Za(e) {
                      return Math.pow(2, Math.round(Math.log(e) / Math.LN2))
                    }

                    function Ya(e) {
                      if ((e.wrapS === wr.REPEAT || e.wrapT === wr.REPEAT) && e.image) {
                        var t = Za(e.width),
                          r = Za(e.height);
                        if (t !== e.width || r !== e.height) {
                          var i = document.createElement("canvas");
                          i.width = t, i.height = r, i.getContext("2d").drawImage(e.image, 0, 0, t, r), e.image = i
                        }
                      }
                    }
                    Xa.loadTexture = function (e, t, r, i) {
                      "function" == typeof r && (i = r, r = {}), r = r || {};
                      for (var n = Object.keys(r).sort(), a = "", o = 0; o < n.length; o++) a += n[o] + "_" + r[n[o]] + "_";
                      var s, l = t.__textureCache = t.__textureCache || new bi(20);
                      if ((s = e).getZr && s.setOption) {
                        var h = e.__textureid__;
                        if (c = l.get(a + h)) c.texture.surface.setECharts(e), i && i(c.texture);
                        else {
                          var u = new hn(e);
                          for (u.onupdate = function () {
                              t.getZr().refresh()
                            }, c = {
                              texture: u.getTexture()
                            }, o = 0; o < n.length; o++) c.texture[n[o]] = r[n[o]];
                          h = e.__textureid__ || "__ecgl_ec__" + c.texture.__uid__, e.__textureid__ = h, l.put(a + h, c), i && i(c.texture)
                        }
                        return c.texture
                      }
                      if (Ha(e)) {
                        var c;
                        if (h = e.__textureid__, !(c = l.get(a + h))) {
                          for (c = {
                              texture: new Xa.Texture2D({
                                image: e
                              })
                            }, o = 0; o < n.length; o++) c.texture[n[o]] = r[n[o]];
                          h = e.__textureid__ || "__ecgl_image__" + c.texture.__uid__, e.__textureid__ = h, l.put(a + h, c), Ya(c.texture), i && i(c.texture)
                        }
                        return c.texture
                      }
                      if (c = l.get(a + e)) c.callbacks ? c.callbacks.push(i) : i && i(c.texture);
                      else if (e.match(/.hdr$|^data:application\/octet-stream/)) {
                        c = {
                          callbacks: [i]
                        };
                        var d = an.loadTexture(e, {
                          exposure: r.exposure,
                          fileType: "hdr"
                        }, (function () {
                          d.dirty(), c.callbacks.forEach((function (e) {
                            e && e(d)
                          })), c.callbacks = null
                        }));
                        c.texture = d, l.put(a + e, c)
                      } else {
                        for (d = new Xa.Texture2D({
                            image: new Image
                          }), o = 0; o < n.length; o++) d[n[o]] = r[n[o]];
                        c = {
                          texture: d,
                          callbacks: [i]
                        };
                        var f = d.image;
                        f.onload = function () {
                          d.image = f, Ya(d), d.dirty(), c.callbacks.forEach((function (e) {
                            e && e(d)
                          })), c.callbacks = null
                        }, f.crossOrigin = "Anonymous", f.src = e, d.image = null !== qa ? qa : qa = an.createBlank("rgba(255,255,255,0)").image, l.put(a + e, c)
                      }
                      return c.texture
                    }, Xa.createAmbientCubemap = function (e, t, r, i) {
                      var n = (e = e || {}).texture,
                        a = Mn(e.exposure, 1),
                        o = new vn({
                          intensity: Mn(e.specularIntensity, 1)
                        }),
                        s = new yn({
                          intensity: Mn(e.diffuseIntensity, 1),
                          coefficients: [.844, .712, .691, -.037, .083, .167, .343, .288, .299, -.041, -.021, -.009, -.003, -.041, -.064, -.011, -.007, -.004, -.031, .034, .081, -.06, -.049, -.06, .046, .056, .05]
                        });
                      return o.cubemap = Xa.loadTexture(n, r, {
                        exposure: a
                      }, (function () {
                        o.cubemap.flipY = !1, o.prefilter(t, 32), s.coefficients = Sn.projectEnvironmentMap(t, o.cubemap, {
                          lod: 1
                        }), i && i()
                      })), {
                        specular: o,
                        diffuse: s
                      }
                    }, Xa.createBlankTexture = an.createBlank, Xa.isImage = Ha, Xa.additiveBlend = function (e) {
                      e.blendEquation(e.FUNC_ADD), e.blendFunc(e.SRC_ALPHA, e.ONE)
                    }, Xa.parseColor = function (e, t) {
                      return e instanceof Array ? (t || (t = []), t[0] = e[0], t[1] = e[1], t[2] = e[2], e.length > 3 ? t[3] = e[3] : t[3] = 1, t) : ((t = i.color.parse(e || "#000", t) || [0, 0, 0, 0])[0] /= 255, t[1] /= 255, t[2] /= 255, t)
                    }, Xa.directionFromAlphaBeta = function (e, t) {
                      var r = e / 180 * Math.PI + Math.PI / 2,
                        i = -t / 180 * Math.PI + Math.PI / 2,
                        n = [],
                        a = Math.sin(r);
                      return n[0] = a * Math.cos(i), n[1] = -Math.cos(r), n[2] = a * Math.sin(i), n
                    }, Xa.getShadowResolution = function (e) {
                      var t = 1024;
                      switch (e) {
                        case "low":
                          t = 512;
                          break;
                        case "medium":
                          break;
                        case "high":
                          t = 2048;
                          break;
                        case "ultra":
                          t = 4096
                      }
                      return t
                    }, Xa.COMMON_SHADERS = ["lambert", "color", "realistic", "hatching", "shadow"], Xa.createShader = function (e) {
                      "ecgl.shadow" === e && (e = "ecgl.displayShadow");
                      var t = Xe.source(e + ".vertex"),
                        r = Xe.source(e + ".fragment");
                      t || console.error("Vertex shader of '%s' not exits", e), r || console.error("Fragment shader of '%s' not exits", e);
                      var i = new Xe(t, r);
                      return i.name = e, i
                    }, Xa.createMaterial = function (e, t) {
                      t instanceof Array || (t = [t]);
                      var r = Xa.createShader(e),
                        i = new le({
                          shader: r
                        });
                      return t.forEach((function (e) {
                        "string" == typeof e && i.define(e)
                      })), i
                    }, Xa.setMaterialFromModel = function (e, t, r, i) {
                      t.autoUpdateTextureStatus = !1;
                      var n = r.getModel(e + "Material"),
                        a = n.get("detailTexture"),
                        o = Mn(n.get("textureTiling"), 1),
                        s = Mn(n.get("textureOffset"), 0);
                      "number" == typeof o && (o = [o, o]), "number" == typeof s && (s = [s, s]);
                      var l = o[0] > 1 || o[1] > 1 ? Xa.Texture.REPEAT : Xa.Texture.CLAMP_TO_EDGE,
                        h = {
                          anisotropic: 8,
                          wrapS: l,
                          wrapT: l
                        };
                      if ("realistic" === e) {
                        var u = n.get("roughness"),
                          c = n.get("metalness");
                        null != c ? isNaN(c) && (t.setTextureImage("metalnessMap", c, i, h), c = Mn(n.get("metalnessAdjust"), .5)) : c = 0, null != u ? isNaN(u) && (t.setTextureImage("roughnessMap", u, i, h), u = Mn(n.get("roughnessAdjust"), .5)) : u = .5;
                        var d = n.get("normalTexture");
                        t.setTextureImage("detailMap", a, i, h), t.setTextureImage("normalMap", d, i, h), t.set({
                          roughness: u,
                          metalness: c,
                          detailUvRepeat: o,
                          detailUvOffset: s
                        })
                      } else if ("lambert" === e) t.setTextureImage("detailMap", a, i, h), t.set({
                        detailUvRepeat: o,
                        detailUvOffset: s
                      });
                      else if ("color" === e) t.setTextureImage("detailMap", a, i, h), t.set({
                        detailUvRepeat: o,
                        detailUvOffset: s
                      });
                      else if ("hatching" === e) {
                        var f = n.get("hatchingTextures") || [];
                        f.length;
                        for (var p = 0; p < 6; p++) t.setTextureImage("hatch" + (p + 1), f[p], i, {
                          anisotropic: 8,
                          wrapS: Xa.Texture.REPEAT,
                          wrapT: Xa.Texture.REPEAT
                        });
                        t.set({
                          detailUvRepeat: o,
                          detailUvOffset: s
                        })
                      }
                    }, Xa.updateVertexAnimation = function (e, t, r, i) {
                      var n = i.get("animation"),
                        a = i.get("animationDurationUpdate"),
                        o = i.get("animationEasingUpdate"),
                        s = r.shadowDepthMaterial;
                      if (n && t && a > 0 && t.geometry.vertexCount === r.geometry.vertexCount) {
                        r.material.define("vertex", "VERTEX_ANIMATION"), r.ignorePreZ = !0, s && s.define("vertex", "VERTEX_ANIMATION");
                        for (var l = 0; l < e.length; l++) r.geometry.attributes[e[l][0]].value = t.geometry.attributes[e[l][1]].value;
                        r.geometry.dirty(), r.__percent = 0, r.material.set("percent", 0), r.stopAnimation(), r.animate().when(a, {
                          __percent: 1
                        }).during((function () {
                          r.material.set("percent", r.__percent), s && s.set("percent", r.__percent)
                        })).done((function () {
                          r.ignorePreZ = !1, r.material.undefine("vertex", "VERTEX_ANIMATION"), s && s.undefine("vertex", "VERTEX_ANIMATION")
                        })).start(o)
                      } else r.material.undefine("vertex", "VERTEX_ANIMATION"), s && s.undefine("vertex", "VERTEX_ANIMATION")
                    };
                    const Ka = Xa,
                      Qa = "undefined" != typeof window && (window.requestAnimationFrame && window.requestAnimationFrame.bind(window) || window.msRequestAnimationFrame && window.msRequestAnimationFrame.bind(window) || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame) || function (e) {
                        return setTimeout(e, 16)
                      };
                    var Ja = function (e, t) {
                      this.id = e, this.zr = t;
                      try {
                        this.renderer = new ut({
                          clearBit: 0,
                          devicePixelRatio: t.painter.dpr,
                          preserveDrawingBuffer: !0,
                          premultipliedAlpha: !0
                        }), this.renderer.resize(t.painter.getWidth(), t.painter.getHeight())
                      } catch (e) {
                        return this.renderer = null, this.dom = document.createElement("div"), this.dom.style.cssText = "position:absolute; left: 0; top: 0; right: 0; bottom: 0;", this.dom.className = "ecgl-nowebgl", this.dom.innerHTML = "Sorry, your browser does not support WebGL", void console.error(e)
                      }
                      this.onglobalout = this.onglobalout.bind(this), t.on("globalout", this.onglobalout), this.dom = this.renderer.canvas;
                      var r = this.dom.style;
                      r.position = "absolute", r.left = "0", r.top = "0", this.views = [], this._picking = new _r({
                        renderer: this.renderer
                      }), this._viewsToDispose = [], this._accumulatingId = 0, this._zrEventProxy = new i.graphic.Rect({
                        shape: {
                          x: -1,
                          y: -1,
                          width: 2,
                          height: 2
                        },
                        __isGLToZRProxy: !0
                      }), this._backgroundColor = null, this._disposed = !1
                    };

                    function $a(e) {
                      var t = e.__zr;
                      e.__zr = null, t && e.removeAnimatorsFromZr && e.removeAnimatorsFromZr(t)
                    }
                    Ja.prototype.setUnpainted = function () {}, Ja.prototype.addView = function (e) {
                      if (e.layer !== this) {
                        var t = this._viewsToDispose.indexOf(e);
                        t >= 0 && this._viewsToDispose.splice(t, 1), this.views.push(e), e.layer = this;
                        var r = this.zr;
                        e.scene.traverse((function (e) {
                          e.__zr = r, e.addAnimatorsToZr && e.addAnimatorsToZr(r)
                        }))
                      }
                    }, Ja.prototype.removeView = function (e) {
                      if (e.layer === this) {
                        var t = this.views.indexOf(e);
                        t >= 0 && (this.views.splice(t, 1), e.scene.traverse($a, this), e.layer = null, this._viewsToDispose.push(e))
                      }
                    }, Ja.prototype.removeViewsAll = function () {
                      this.views.forEach((function (e) {
                        e.scene.traverse($a, this), e.layer = null, this._viewsToDispose.push(e)
                      }), this), this.views.length = 0
                    }, Ja.prototype.resize = function (e, t) {
                      this.renderer.resize(e, t)
                    }, Ja.prototype.clear = function () {
                      var e = this.renderer.gl,
                        t = this._backgroundColor || [0, 0, 0, 0];
                      e.clearColor(t[0], t[1], t[2], t[3]), e.depthMask(!0), e.colorMask(!0, !0, !0, !0), e.clear(e.DEPTH_BUFFER_BIT | e.COLOR_BUFFER_BIT)
                    }, Ja.prototype.clearDepth = function () {
                      var e = this.renderer.gl;
                      e.clear(e.DEPTH_BUFFER_BIT)
                    }, Ja.prototype.clearColor = function () {
                      var e = this.renderer.gl;
                      e.clearColor(0, 0, 0, 0), e.clear(e.COLOR_BUFFER_BIT)
                    }, Ja.prototype.needsRefresh = function () {
                      this.zr.refresh()
                    }, Ja.prototype.refresh = function (e) {
                      this._backgroundColor = e ? Ka.parseColor(e) : [0, 0, 0, 0], this.renderer.clearColor = this._backgroundColor;
                      for (var t = 0; t < this.views.length; t++) this.views[t].prepareRender(this.renderer);
                      for (this._doRender(!1), this._trackAndClean(), t = 0; t < this._viewsToDispose.length; t++) this._viewsToDispose[t].dispose(this.renderer);
                      this._viewsToDispose.length = 0, this._startAccumulating()
                    }, Ja.prototype.renderToCanvas = function (e) {
                      this._startAccumulating(!0), e.drawImage(this.dom, 0, 0, e.canvas.width, e.canvas.height)
                    }, Ja.prototype._doRender = function (e) {
                      this.clear(), this.renderer.saveViewport();
                      for (var t = 0; t < this.views.length; t++) this.views[t].render(this.renderer, e);
                      this.renderer.restoreViewport()
                    }, Ja.prototype._stopAccumulating = function () {
                      this._accumulatingId = 0, clearTimeout(this._accumulatingTimeout)
                    };
                    var eo = 1;

                    function to(e) {
                      for (var t = 0; t < e.length; t++) e[t].__used__ = 0
                    }

                    function ro(e, t) {
                      for (var r = 0; r < t.length; r++) t[r].__used__ || t[r].dispose(e)
                    }

                    function io(e, t) {
                      e.__used__ = e.__used__ || 0, e.__used__++, 1 === e.__used__ && t.push(e)
                    }

                    function no(e, t, r) {
                      var i, n;
                      e.traverse((function (e) {
                        if (e.isRenderable()) {
                          var a = e.geometry,
                            o = e.material;
                          if (o !== i)
                            for (var s = o.getTextureUniforms(), l = 0; l < s.length; l++) {
                              var h = s[l],
                                u = o.uniforms[h].value;
                              if (u)
                                if (u instanceof wr) io(u, t);
                                else if (u instanceof Array)
                                for (var c = 0; c < u.length; c++) u[c] instanceof wr && io(u[c], t)
                            }
                          a !== n && io(a, r), i = o, n = a
                        }
                      }));
                      for (var a = 0; a < e.lights.length; a++) e.lights[a].cubemap && io(e.lights[a].cubemap, t)
                    }
                    Ja.prototype._startAccumulating = function (e) {
                      var t = this;
                      this._stopAccumulating();
                      for (var r = !1, i = 0; i < this.views.length; i++) r = this.views[i].needsAccumulate() || r;

                      function n(i) {
                        if (t._accumulatingId && i === t._accumulatingId) {
                          for (var a = !0, o = 0; o < t.views.length; o++) a = t.views[o].isAccumulateFinished() && r;
                          a || (t._doRender(!0), e ? n(i) : Qa((function () {
                            n(i)
                          })))
                        }
                      }
                      r && (this._accumulatingId = eo++, e ? n(t._accumulatingId) : this._accumulatingTimeout = setTimeout((function () {
                        n(t._accumulatingId)
                      }), 50))
                    }, Ja.prototype._trackAndClean = function () {
                      var e = [],
                        t = [];
                      this._textureList && (to(this._textureList), to(this._geometriesList));
                      for (var r = 0; r < this.views.length; r++) no(this.views[r].scene, e, t);
                      this._textureList && (ro(this.renderer, this._textureList), ro(this.renderer, this._geometriesList)), this._textureList = e, this._geometriesList = t
                    }, Ja.prototype.dispose = function () {
                      this._disposed || (this._stopAccumulating(), this._textureList && (to(this._textureList), to(this._geometriesList), ro(this.renderer, this._textureList), ro(this.renderer, this._geometriesList)), this.zr.off("globalout", this.onglobalout), this._disposed = !0)
                    }, Ja.prototype.onmousedown = function (e) {
                      if (!e.target || !e.target.__isGLToZRProxy) {
                        e = e.event;
                        var t = this.pickObject(e.offsetX, e.offsetY);
                        t && (this._dispatchEvent("mousedown", e, t), this._dispatchDataEvent("mousedown", e, t)), this._downX = e.offsetX, this._downY = e.offsetY
                      }
                    }, Ja.prototype.onmousemove = function (e) {
                      if (!e.target || !e.target.__isGLToZRProxy) {
                        e = e.event;
                        var t = this.pickObject(e.offsetX, e.offsetY),
                          r = t && t.target,
                          i = this._hovered;
                        this._hovered = t, i && r !== i.target && (i.relatedTarget = r, this._dispatchEvent("mouseout", e, i), this.zr.setCursorStyle("default")), this._dispatchEvent("mousemove", e, t), t && (this.zr.setCursorStyle("pointer"), i && r === i.target || this._dispatchEvent("mouseover", e, t)), this._dispatchDataEvent("mousemove", e, t)
                      }
                    }, Ja.prototype.onmouseup = function (e) {
                      if (!e.target || !e.target.__isGLToZRProxy) {
                        e = e.event;
                        var t = this.pickObject(e.offsetX, e.offsetY);
                        t && (this._dispatchEvent("mouseup", e, t), this._dispatchDataEvent("mouseup", e, t)), this._upX = e.offsetX, this._upY = e.offsetY
                      }
                    }, Ja.prototype.onclick = Ja.prototype.dblclick = function (e) {
                      if (!e.target || !e.target.__isGLToZRProxy) {
                        var t = this._upX - this._downX,
                          r = this._upY - this._downY;
                        if (!(Math.sqrt(t * t + r * r) > 20)) {
                          e = e.event;
                          var i = this.pickObject(e.offsetX, e.offsetY);
                          i && (this._dispatchEvent(e.type, e, i), this._dispatchDataEvent(e.type, e, i));
                          var n = this._clickToSetFocusPoint(e);
                          n && n.view.setDOFFocusOnPoint(n.distance) && this.zr.refresh()
                        }
                      }
                    }, Ja.prototype._clickToSetFocusPoint = function (e) {
                      for (var t = this.renderer, r = t.viewport, i = this.views.length - 1; i >= 0; i--) {
                        var n = this.views[i];
                        if (n.hasDOF() && n.containPoint(e.offsetX, e.offsetY)) {
                          this._picking.scene = n.scene, this._picking.camera = n.camera, t.viewport = n.viewport;
                          var a = this._picking.pick(e.offsetX, e.offsetY, !0);
                          if (a) return a.view = n, a
                        }
                      }
                      t.viewport = r
                    }, Ja.prototype.onglobalout = function (e) {
                      var t = this._hovered;
                      t && this._dispatchEvent("mouseout", e, {
                        target: t.target
                      })
                    }, Ja.prototype.pickObject = function (e, t) {
                      for (var r = [], i = this.renderer, n = i.viewport, a = 0; a < this.views.length; a++) {
                        var o = this.views[a];
                        o.containPoint(e, t) && (this._picking.scene = o.scene, this._picking.camera = o.camera, i.viewport = o.viewport, this._picking.pickAll(e, t, r))
                      }
                      return i.viewport = n, r.sort((function (e, t) {
                        return e.distance - t.distance
                      })), r[0]
                    }, Ja.prototype._dispatchEvent = function (e, t, r) {
                      r || (r = {});
                      var i = r.target;
                      for (r.cancelBubble = !1, r.event = t, r.type = e, r.offsetX = t.offsetX, r.offsetY = t.offsetY; i && (i.trigger(e, r), i = i.getParent(), !r.cancelBubble););
                      this._dispatchToView(e, r)
                    }, Ja.prototype._dispatchDataEvent = function (e, t, r) {
                      var n = r && r.target,
                        a = n && n.dataIndex,
                        o = n && n.seriesIndex,
                        s = n && n.eventData,
                        l = !1,
                        h = this._zrEventProxy;
                      h.x = t.offsetX, h.y = t.offsetY, h.update();
                      var u = {
                        target: h
                      };
                      const c = i.helper.getECData(h);
                      "mousemove" === e && (null != a ? a !== this._lastDataIndex && (parseInt(this._lastDataIndex, 10) >= 0 && (c.dataIndex = this._lastDataIndex, c.seriesIndex = this._lastSeriesIndex, this.zr.handler.dispatchToElement(u, "mouseout", t)), l = !0) : null != s && s !== this._lastEventData && (null != this._lastEventData && (c.eventData = this._lastEventData, this.zr.handler.dispatchToElement(u, "mouseout", t)), l = !0), this._lastEventData = s, this._lastDataIndex = a, this._lastSeriesIndex = o), c.eventData = s, c.dataIndex = a, c.seriesIndex = o, (null != s || parseInt(a, 10) >= 0 && parseInt(o, 10) >= 0) && (this.zr.handler.dispatchToElement(u, e, t), l && this.zr.handler.dispatchToElement(u, "mouseover", t))
                    }, Ja.prototype._dispatchToView = function (e, t) {
                      for (var r = 0; r < this.views.length; r++) this.views[r].containPoint(t.offsetX, t.offsetY) && this.views[r].trigger(e, t)
                    }, Object.assign(Ja.prototype, h);
                    const ao = Ja;
                    var oo = ["bar3D", "line3D", "map3D", "scatter3D", "surface", "lines3D", "scatterGL", "scatter3D"];

                    function so(e, t) {
                      if (e && e[t] && (e[t].normal || e[t].emphasis)) {
                        var r = e[t].normal,
                          i = e[t].emphasis;
                        r && (e[t] = r), i && (e.emphasis = e.emphasis || {}, e.emphasis[t] = i)
                      }
                    }

                    function lo(e) {
                      e && (e instanceof Array || (e = [e]), i.util.each(e, (function (e) {
                        if (e.axisLabel) {
                          var t = e.axisLabel;
                          Object.assign(t, t.textStyle), t.textStyle = null
                        }
                      })))
                    }

                    function ho(e) {
                      this._layers = {}, this._zr = e
                    }
                    ho.prototype.update = function (e, t) {
                      var r = this,
                        n = t.getZr();
                      if (n.getWidth() && n.getHeight()) {
                        for (var a in this._layers) this._layers[a].removeViewsAll();
                        e.eachComponent((function (r, i) {
                          if ("series" !== r) {
                            var n = t.getViewOfComponentModel(i),
                              a = i.coordinateSystem;
                            if (n.__ecgl__) {
                              if (a) {
                                if (!a.viewGL) return void console.error("Can't find viewGL in coordinateSystem of component " + i.id);
                                l = a.viewGL
                              } else {
                                if (!i.viewGL) return void console.error("Can't find viewGL of component " + i.id);
                                l = a.viewGL
                              }
                              var l = a.viewGL,
                                h = o(i);
                              h.addView(l), n.afterRender && n.afterRender(i, e, t, h), s(n.groupGL, i.get("silent"))
                            }
                          }
                        })), e.eachSeries((function (r) {
                          var i = t.getViewOfSeriesModel(r),
                            n = r.coordinateSystem;
                          if (i.__ecgl__) {
                            if (n && !n.viewGL && !i.viewGL) return void console.error("Can't find viewGL of series " + i.id);
                            var a = n && n.viewGL || i.viewGL,
                              l = o(r);
                            l.addView(a), i.afterRender && i.afterRender(r, e, t, l), s(i.groupGL, r.get("silent"))
                          }
                        }))
                      } else console.warn("Dom has no width or height");

                      function o(e) {
                        var t;
                        n.setSleepAfterStill(0), e.coordinateSystem && e.coordinateSystem.model, t = e.get("zlevel");
                        var a = r._layers,
                          o = a[t];
                        if (!o) {
                          if (o = a[t] = new ao("gl-" + t, n), n.painter.isSingleCanvas()) {
                            o.virtual = !0;
                            var s = new i.graphic.Image({
                              z: 1e4,
                              style: {
                                image: o.renderer.canvas
                              },
                              silent: !0
                            });
                            o.__hostImage = s, n.add(s)
                          }
                          n.painter.insertLayer(t, o)
                        }
                        return o.__hostImage && o.__hostImage.setStyle({
                          width: o.renderer.getWidth(),
                          height: o.renderer.getHeight()
                        }), o
                      }

                      function s(e, t) {
                        e && e.traverse((function (e) {
                          e.isRenderable && e.isRenderable() && (e.ignorePicking = null != e.$ignorePicking ? e.$ignorePicking : t)
                        }))
                      }
                    }, i.registerPostInit((function (e) {
                      var t = e.getZr(),
                        r = t.painter.dispose;
                      t.painter.dispose = function () {
                        this.eachOtherLayer((function (e) {
                          e instanceof ao && e.dispose()
                        })), r.call(this)
                      }, t.painter.getRenderedCanvas = function (e) {
                        if (e = e || {}, this._singleCanvas) return this._layers[0].dom;
                        var t = document.createElement("canvas"),
                          r = e.pixelRatio || this.dpr;
                        t.width = this.getWidth() * r, t.height = this.getHeight() * r;
                        var i = t.getContext("2d");
                        i.dpr = r, i.clearRect(0, 0, t.width, t.height), e.backgroundColor && (i.fillStyle = e.backgroundColor, i.fillRect(0, 0, t.width, t.height));
                        var n, a = this.storage.getDisplayList(!0),
                          o = {},
                          s = this;

                        function l(e, t) {
                          var r, n = s._zlevelList;
                          null == e && (e = -1 / 0);
                          for (var a = 0; a < n.length; a++) {
                            var o = n[a],
                              l = s._layers[o];
                            if (!l.__builtin__ && o > e && o < t) {
                              r = l;
                              break
                            }
                          }
                          r && r.renderToCanvas && (i.save(), r.renderToCanvas(i), i.restore())
                        }
                        for (var h = {
                            ctx: i
                          }, u = 0; u < a.length; u++) {
                          var c = a[u];
                          c.zlevel !== n && (l(n, c.zlevel), n = c.zlevel), this._doPaintEl(c, h, !0, null, o)
                        }
                        return l(n, 1 / 0), t
                      }
                    })), i.registerPostUpdate((function (e, t) {
                      var r = t.getZr();
                      (r.__egl = r.__egl || new ho(r)).update(e, t)
                    })), i.registerPreprocessor((function (e) {
                      i.util.each(e.series, (function (t) {
                        i.util.indexOf(oo, t.type) >= 0 && (function (e) {
                          so(e, "itemStyle"), so(e, "lineStyle"), so(e, "areaStyle"), so(e, "label")
                        }(t), "mapbox" === t.coordinateSystem && (t.coordinateSystem = "mapbox3D", e.mapbox3D = e.mapbox))
                      })), lo(e.xAxis3D), lo(e.yAxis3D), lo(e.zAxis3D), lo(e.grid3D), so(e.geo3D)
                    }));
                    const uo = {
                        defaultOption: {
                          viewControl: {
                            projection: "perspective",
                            autoRotate: !1,
                            autoRotateDirection: "cw",
                            autoRotateSpeed: 10,
                            autoRotateAfterStill: 3,
                            damping: .8,
                            rotateSensitivity: 1,
                            zoomSensitivity: 1,
                            panSensitivity: 1,
                            panMouseButton: "middle",
                            rotateMouseButton: "left",
                            distance: 150,
                            minDistance: 40,
                            maxDistance: 400,
                            orthographicSize: 150,
                            maxOrthographicSize: 400,
                            minOrthographicSize: 20,
                            center: [0, 0, 0],
                            alpha: 0,
                            beta: 0,
                            minAlpha: -90,
                            maxAlpha: 90
                          }
                        },
                        setView: function (e) {
                          e = e || {}, this.option.viewControl = this.option.viewControl || {}, null != e.alpha && (this.option.viewControl.alpha = e.alpha), null != e.beta && (this.option.viewControl.beta = e.beta), null != e.distance && (this.option.viewControl.distance = e.distance), null != e.center && (this.option.viewControl.center = e.center)
                        }
                      },
                      co = {
                        defaultOption: {
                          postEffect: {
                            enable: !1,
                            bloom: {
                              enable: !0,
                              intensity: .1
                            },
                            depthOfField: {
                              enable: !1,
                              focalRange: 20,
                              focalDistance: 50,
                              blurRadius: 10,
                              fstop: 2.8,
                              quality: "medium"
                            },
                            screenSpaceAmbientOcclusion: {
                              enable: !1,
                              radius: 2,
                              quality: "medium",
                              intensity: 1
                            },
                            screenSpaceReflection: {
                              enable: !1,
                              quality: "medium",
                              maxRoughness: .8
                            },
                            colorCorrection: {
                              enable: !0,
                              exposure: 0,
                              brightness: 0,
                              contrast: 1,
                              saturation: 1,
                              lookupTexture: ""
                            },
                            edge: {
                              enable: !1
                            },
                            FXAA: {
                              enable: !1
                            }
                          },
                          temporalSuperSampling: {
                            enable: "auto"
                          }
                        }
                      },
                      fo = {
                        defaultOption: {
                          light: {
                            main: {
                              shadow: !1,
                              shadowQuality: "high",
                              color: "#fff",
                              intensity: 1,
                              alpha: 0,
                              beta: 0
                            },
                            ambient: {
                              color: "#fff",
                              intensity: .2
                            },
                            ambientCubemap: {
                              texture: null,
                              exposure: 1,
                              diffuseIntensity: .5,
                              specularIntensity: .5
                            }
                          }
                        }
                      };
                    var po = i.ComponentModel.extend({
                      type: "grid3D",
                      dependencies: ["xAxis3D", "yAxis3D", "zAxis3D"],
                      defaultOption: {
                        show: !0,
                        zlevel: -10,
                        left: 0,
                        top: 0,
                        width: "100%",
                        height: "100%",
                        environment: "auto",
                        boxWidth: 100,
                        boxHeight: 100,
                        boxDepth: 100,
                        axisPointer: {
                          show: !0,
                          lineStyle: {
                            color: "rgba(0, 0, 0, 0.8)",
                            width: 1
                          },
                          label: {
                            show: !0,
                            formatter: null,
                            margin: 8,
                            textStyle: {
                              fontSize: 14,
                              color: "#fff",
                              backgroundColor: "rgba(0,0,0,0.5)",
                              padding: 3,
                              borderRadius: 3
                            }
                          }
                        },
                        axisLine: {
                          show: !0,
                          lineStyle: {
                            color: "#333",
                            width: 2,
                            type: "solid"
                          }
                        },
                        axisTick: {
                          show: !0,
                          inside: !1,
                          length: 3,
                          lineStyle: {
                            width: 1
                          }
                        },
                        axisLabel: {
                          show: !0,
                          inside: !1,
                          rotate: 0,
                          margin: 8,
                          textStyle: {
                            fontSize: 12
                          }
                        },
                        splitLine: {
                          show: !0,
                          lineStyle: {
                            color: ["#ccc"],
                            width: 1,
                            type: "solid"
                          }
                        },
                        splitArea: {
                          show: !1,
                          areaStyle: {
                            color: ["rgba(250,250,250,0.3)", "rgba(200,200,200,0.3)"]
                          }
                        },
                        light: {
                          main: {
                            alpha: 30,
                            beta: 40
                          },
                          ambient: {
                            intensity: .4
                          }
                        },
                        viewControl: {
                          alpha: 20,
                          beta: 40,
                          autoRotate: !1,
                          distance: 200,
                          minDistance: 40,
                          maxDistance: 400
                        }
                      }
                    });
                    i.util.merge(po.prototype, uo), i.util.merge(po.prototype, co), i.util.merge(po.prototype, fo);
                    const mo = po;

                    function go(e, t) {
                      switch (e) {
                        case "center":
                        case "middle":
                          e = "50%";
                          break;
                        case "left":
                        case "top":
                          e = "0%";
                          break;
                        case "right":
                        case "bottom":
                          e = "100%"
                      }
                      return "string" == typeof e ? (r = e, r.replace(/^\s+|\s+$/g, "")).match(/%$/) ? parseFloat(e) / 100 * t : parseFloat(e) : null == e ? NaN : +e;
                      var r
                    }

                    function _o() {
                      var e = "__ec_inner_" + vo++;
                      return function (t) {
                        return t[e] || (t[e] = {})
                      }
                    }
                    var vo = Math.round(9 * Math.random()),
                      yo = {};

                    function xo(e, t, r, i, n) {
                      var a = {};
                      return function (e, t, r, i, n) {
                        r = r || yo;
                        var a, o = t.ecModel,
                          s = o && o.option.textStyle,
                          l = function (e) {
                            for (var t; e && e !== e.ecModel;) {
                              var r = (e.option || yo).rich;
                              if (r) {
                                t = t || {};
                                for (var i = ba(r), n = 0; n < i.length; n++) t[i[n]] = 1
                              }
                              e = e.parentModel
                            }
                            return t
                          }(t);
                        if (l)
                          for (var h in a = {}, l)
                            if (l.hasOwnProperty(h)) {
                              var u = t.getModel(["rich", h]);
                              So(a[h] = {}, u, s, r, i, n, !1, !0)
                            } a && (e.rich = a);
                        var c = t.get("overflow");
                        c && (e.overflow = c);
                        var d = t.get("minMargin");
                        null != d && (e.margin = d), So(e, t, s, r, i, n, !0, !1)
                      }(a, e, r, i, n), t && ga(a, t), a
                    }
                    var bo = ["fontStyle", "fontWeight", "fontSize", "fontFamily", "textShadowColor", "textShadowBlur", "textShadowOffsetX", "textShadowOffsetY"],
                      wo = ["align", "lineHeight", "width", "height", "tag", "verticalAlign"],
                      To = ["padding", "borderWidth", "borderRadius", "borderDashOffset", "backgroundColor", "borderColor", "shadowColor", "shadowBlur", "shadowOffsetX", "shadowOffsetY"];

                    function So(e, t, r, i, n, a, o, s) {
                      r = !n && r || yo;
                      var l = i && i.inheritColor,
                        h = t.getShallow("color"),
                        u = t.getShallow("textBorderColor"),
                        c = Ta(t.getShallow("opacity"), r.opacity);
                      "inherit" !== h && "auto" !== h || (h = l || null), "inherit" !== u && "auto" !== u || (u = l || null), a || (h = h || r.color, u = u || r.textBorderColor), null != h && (e.fill = h), null != u && (e.stroke = u);
                      var d = Ta(t.getShallow("textBorderWidth"), r.textBorderWidth);
                      null != d && (e.lineWidth = d);
                      var f = Ta(t.getShallow("textBorderType"), r.textBorderType);
                      null != f && (e.lineDash = f);
                      var p = Ta(t.getShallow("textBorderDashOffset"), r.textBorderDashOffset);
                      null != p && (e.lineDashOffset = p), n || null != c || s || (c = i && i.defaultOpacity), null != c && (e.opacity = c), n || a || null == e.fill && i.inheritColor && (e.fill = i.inheritColor);
                      for (var m = 0; m < bo.length; m++) {
                        var g = bo[m];
                        null != (v = Ta(t.getShallow(g), r[g])) && (e[g] = v)
                      }
                      for (m = 0; m < wo.length; m++) g = wo[m], null != (v = t.getShallow(g)) && (e[g] = v);
                      if (null == e.verticalAlign) {
                        var _ = t.getShallow("baseline");
                        null != _ && (e.verticalAlign = _)
                      }
                      if (!o || !i.disableBox) {
                        for (m = 0; m < To.length; m++) {
                          var v;
                          g = To[m], null != (v = t.getShallow(g)) && (e[g] = v)
                        }
                        var y = t.getShallow("borderType");
                        null != y && (e.borderDash = y), "auto" !== e.backgroundColor && "inherit" !== e.backgroundColor || !l || (e.backgroundColor = l), "auto" !== e.borderColor && "inherit" !== e.borderColor || !l || (e.borderColor = l)
                      }
                    }
                    _o();
                    var Mo = Mn,
                      Ao = {
                        left: 0,
                        middle: 1,
                        right: 2
                      };

                    function Eo(e) {
                      return e instanceof Array || (e = [e, e]), e
                    }
                    var Co = m.extend((function () {
                      return {
                        zr: null,
                        viewGL: null,
                        _center: new vt,
                        minDistance: .5,
                        maxDistance: 1.5,
                        maxOrthographicSize: 300,
                        minOrthographicSize: 30,
                        minAlpha: -90,
                        maxAlpha: 90,
                        minBeta: -1 / 0,
                        maxBeta: 1 / 0,
                        autoRotateAfterStill: 0,
                        autoRotateDirection: "cw",
                        autoRotateSpeed: 60,
                        damping: .8,
                        rotateSensitivity: 1,
                        zoomSensitivity: 1,
                        panSensitivity: 1,
                        panMouseButton: "middle",
                        rotateMouseButton: "left",
                        _mode: "rotate",
                        _camera: null,
                        _needsUpdate: !1,
                        _rotating: !1,
                        _phi: 0,
                        _theta: 0,
                        _mouseX: 0,
                        _mouseY: 0,
                        _rotateVelocity: new _e,
                        _panVelocity: new _e,
                        _distance: 500,
                        _zoomSpeed: 0,
                        _stillTimeout: 0,
                        _animators: []
                      }
                    }), (function () {
                      ["_mouseDownHandler", "_mouseWheelHandler", "_mouseMoveHandler", "_mouseUpHandler", "_pinchHandler", "_contextMenuHandler", "_update"].forEach((function (e) {
                        this[e] = this[e].bind(this)
                      }), this)
                    }), {
                      init: function () {
                        var e = this.zr;
                        e && (e.on("mousedown", this._mouseDownHandler), e.on("globalout", this._mouseUpHandler), e.on("mousewheel", this._mouseWheelHandler), e.on("pinch", this._pinchHandler), e.animation.on("frame", this._update), e.dom.addEventListener("contextmenu", this._contextMenuHandler))
                      },
                      dispose: function () {
                        var e = this.zr;
                        e && (e.off("mousedown", this._mouseDownHandler), e.off("mousemove", this._mouseMoveHandler), e.off("mouseup", this._mouseUpHandler), e.off("mousewheel", this._mouseWheelHandler), e.off("pinch", this._pinchHandler), e.off("globalout", this._mouseUpHandler), e.dom.removeEventListener("contextmenu", this._contextMenuHandler), e.animation.off("frame", this._update)), this.stopAllAnimation()
                      },
                      getDistance: function () {
                        return this._distance
                      },
                      setDistance: function (e) {
                        this._distance = e, this._needsUpdate = !0
                      },
                      getOrthographicSize: function () {
                        return this._orthoSize
                      },
                      setOrthographicSize: function (e) {
                        this._orthoSize = e, this._needsUpdate = !0
                      },
                      getAlpha: function () {
                        return this._theta / Math.PI * 180
                      },
                      getBeta: function () {
                        return -this._phi / Math.PI * 180
                      },
                      getCenter: function () {
                        return this._center.toArray()
                      },
                      setAlpha: function (e) {
                        e = Math.max(Math.min(this.maxAlpha, e), this.minAlpha), this._theta = e / 180 * Math.PI, this._needsUpdate = !0
                      },
                      setBeta: function (e) {
                        e = Math.max(Math.min(this.maxBeta, e), this.minBeta), this._phi = -e / 180 * Math.PI, this._needsUpdate = !0
                      },
                      setCenter: function (e) {
                        this._center.setArray(e)
                      },
                      setViewGL: function (e) {
                        this.viewGL = e
                      },
                      getCamera: function () {
                        return this.viewGL.camera
                      },
                      setFromViewControlModel: function (e, t) {
                        var r = (t = t || {}).baseDistance || 0,
                          i = t.baseOrthoSize || 1,
                          n = e.get("projection");
                        "perspective" !== n && "orthographic" !== n && "isometric" !== n && (n = "perspective"), this._projection = n, this.viewGL.setProjection(n);
                        var a = e.get("distance") + r,
                          o = e.get("orthographicSize") + i;
                        [
                          ["damping", .8],
                          ["autoRotate", !1],
                          ["autoRotateAfterStill", 3],
                          ["autoRotateDirection", "cw"],
                          ["autoRotateSpeed", 10],
                          ["minDistance", 30],
                          ["maxDistance", 400],
                          ["minOrthographicSize", 30],
                          ["maxOrthographicSize", 300],
                          ["minAlpha", -90],
                          ["maxAlpha", 90],
                          ["minBeta", -1 / 0],
                          ["maxBeta", 1 / 0],
                          ["rotateSensitivity", 1],
                          ["zoomSensitivity", 1],
                          ["panSensitivity", 1],
                          ["panMouseButton", "left"],
                          ["rotateMouseButton", "middle"]
                        ].forEach((function (t) {
                          this[t[0]] = Mo(e.get(t[0]), t[1])
                        }), this), this.minDistance += r, this.maxDistance += r, this.minOrthographicSize += i, this.maxOrthographicSize += i;
                        var s = e.ecModel,
                          l = {};
                        ["animation", "animationDurationUpdate", "animationEasingUpdate"].forEach((function (t) {
                          l[t] = Mo(e.get(t), s && s.get(t))
                        }));
                        var h = Mo(t.alpha, e.get("alpha")) || 0,
                          u = Mo(t.beta, e.get("beta")) || 0,
                          c = Mo(t.center, e.get("center")) || [0, 0, 0];
                        l.animation && l.animationDurationUpdate > 0 && this._notFirst ? this.animateTo({
                          alpha: h,
                          beta: u,
                          center: c,
                          distance: a,
                          orthographicSize: o,
                          easing: l.animationEasingUpdate,
                          duration: l.animationDurationUpdate
                        }) : (this.setDistance(a), this.setAlpha(h), this.setBeta(u), this.setCenter(c), this.setOrthographicSize(o)), this._notFirst = !0, this._validateProperties()
                      },
                      _validateProperties: function () {},
                      animateTo: function (e) {
                        var t = this.zr,
                          r = this,
                          i = {},
                          n = {};
                        return null != e.distance && (i.distance = this.getDistance(), n.distance = e.distance), null != e.orthographicSize && (i.orthographicSize = this.getOrthographicSize(), n.orthographicSize = e.orthographicSize), null != e.alpha && (i.alpha = this.getAlpha(), n.alpha = e.alpha), null != e.beta && (i.beta = this.getBeta(), n.beta = e.beta), null != e.center && (i.center = this.getCenter(), n.center = e.center), this._addAnimator(t.animation.animate(i).when(e.duration || 1e3, n).during((function () {
                          null != i.alpha && r.setAlpha(i.alpha), null != i.beta && r.setBeta(i.beta), null != i.distance && r.setDistance(i.distance), null != i.center && r.setCenter(i.center), null != i.orthographicSize && r.setOrthographicSize(i.orthographicSize), r._needsUpdate = !0
                        }))).start(e.easing || "linear")
                      },
                      stopAllAnimation: function () {
                        for (var e = 0; e < this._animators.length; e++) this._animators[e].stop();
                        this._animators.length = 0
                      },
                      update: function () {
                        this._needsUpdate = !0, this._update(20)
                      },
                      _isAnimating: function () {
                        return this._animators.length > 0
                      },
                      _update: function (e) {
                        if (this._rotating) {
                          var t = ("cw" === this.autoRotateDirection ? 1 : -1) * this.autoRotateSpeed / 180 * Math.PI;
                          this._phi -= t * e / 1e3, this._needsUpdate = !0
                        } else this._rotateVelocity.len() > 0 && (this._needsUpdate = !0);
                        (Math.abs(this._zoomSpeed) > .1 || this._panVelocity.len() > 0) && (this._needsUpdate = !0), this._needsUpdate && (e = Math.min(e, 50), this._updateDistanceOrSize(e), this._updatePan(e), this._updateRotate(e), this._updateTransform(), this.getCamera().update(), this.zr && this.zr.refresh(), this.trigger("update"), this._needsUpdate = !1)
                      },
                      _updateRotate: function (e) {
                        var t = this._rotateVelocity;
                        this._phi = t.y * e / 20 + this._phi, this._theta = t.x * e / 20 + this._theta, this.setAlpha(this.getAlpha()), this.setBeta(this.getBeta()), this._vectorDamping(t, Math.pow(this.damping, e / 16))
                      },
                      _updateDistanceOrSize: function (e) {
                        "perspective" === this._projection ? this._setDistance(this._distance + this._zoomSpeed * e / 20) : this._setOrthoSize(this._orthoSize + this._zoomSpeed * e / 20), this._zoomSpeed *= Math.pow(this.damping, e / 16)
                      },
                      _setDistance: function (e) {
                        this._distance = Math.max(Math.min(e, this.maxDistance), this.minDistance)
                      },
                      _setOrthoSize: function (e) {
                        this._orthoSize = Math.max(Math.min(e, this.maxOrthographicSize), this.minOrthographicSize);
                        var t = this.getCamera(),
                          r = this._orthoSize,
                          i = r / this.viewGL.viewport.height * this.viewGL.viewport.width;
                        t.left = -i / 2, t.right = i / 2, t.top = r / 2, t.bottom = -r / 2
                      },
                      _updatePan: function (e) {
                        var t = this._panVelocity,
                          r = this._distance,
                          i = this.getCamera(),
                          n = i.worldTransform.y,
                          a = i.worldTransform.x;
                        this._center.scaleAndAdd(a, -t.x * r / 200).scaleAndAdd(n, -t.y * r / 200), this._vectorDamping(t, 0)
                      },
                      _updateTransform: function () {
                        var e = this.getCamera(),
                          t = new vt,
                          r = this._theta + Math.PI / 2,
                          i = this._phi + Math.PI / 2,
                          n = Math.sin(r);
                        t.x = n * Math.cos(i), t.y = -Math.cos(r), t.z = n * Math.sin(i), e.position.copy(this._center).scaleAndAdd(t, this._distance), e.rotation.identity().rotateY(-this._phi).rotateX(-this._theta)
                      },
                      _startCountingStill: function () {
                        clearTimeout(this._stillTimeout);
                        var e = this.autoRotateAfterStill,
                          t = this;
                        !isNaN(e) && e > 0 && (this._stillTimeout = setTimeout((function () {
                          t._rotating = !0
                        }), 1e3 * e))
                      },
                      _vectorDamping: function (e, t) {
                        var r = e.len();
                        (r *= t) < 1e-4 && (r = 0), e.normalize().scale(r)
                      },
                      _decomposeTransform: function () {
                        if (this.getCamera()) {
                          this.getCamera().updateWorldTransform();
                          var e = this.getCamera().worldTransform.z,
                            t = Math.asin(e.y),
                            r = Math.atan2(e.x, e.z);
                          this._theta = t, this._phi = -r, this.setBeta(this.getBeta()), this.setAlpha(this.getAlpha()), this.getCamera().aspect ? this._setDistance(this.getCamera().position.dist(this._center)) : this._setOrthoSize(this.getCamera().top - this.getCamera().bottom)
                        }
                      },
                      _mouseDownHandler: function (e) {
                        if (!e.target && !this._isAnimating()) {
                          var t = e.offsetX,
                            r = e.offsetY;
                          this.viewGL && !this.viewGL.containPoint(t, r) || (this.zr.on("mousemove", this._mouseMoveHandler), this.zr.on("mouseup", this._mouseUpHandler), e.event.targetTouches ? 1 === e.event.targetTouches.length && (this._mode = "rotate") : e.event.button === Ao[this.rotateMouseButton] ? this._mode = "rotate" : e.event.button === Ao[this.panMouseButton] ? this._mode = "pan" : this._mode = "", this._rotateVelocity.set(0, 0), this._rotating = !1, this.autoRotate && this._startCountingStill(), this._mouseX = e.offsetX, this._mouseY = e.offsetY)
                        }
                      },
                      _mouseMoveHandler: function (e) {
                        if (!(e.target && e.target.__isGLToZRProxy || this._isAnimating())) {
                          var t = Eo(this.panSensitivity),
                            r = Eo(this.rotateSensitivity);
                          "rotate" === this._mode ? (this._rotateVelocity.y = (e.offsetX - this._mouseX) / this.zr.getHeight() * 2 * r[0], this._rotateVelocity.x = (e.offsetY - this._mouseY) / this.zr.getWidth() * 2 * r[1]) : "pan" === this._mode && (this._panVelocity.x = (e.offsetX - this._mouseX) / this.zr.getWidth() * t[0] * 400, this._panVelocity.y = (-e.offsetY + this._mouseY) / this.zr.getHeight() * t[1] * 400), this._mouseX = e.offsetX, this._mouseY = e.offsetY, e.event.preventDefault()
                        }
                      },
                      _mouseWheelHandler: function (e) {
                        if (!this._isAnimating()) {
                          var t = e.event.wheelDelta || -e.event.detail;
                          this._zoomHandler(e, t)
                        }
                      },
                      _pinchHandler: function (e) {
                        this._isAnimating() || (this._zoomHandler(e, e.pinchScale > 1 ? 1 : -1), this._mode = "")
                      },
                      _zoomHandler: function (e, t) {
                        if (0 !== t) {
                          var r, i = e.offsetX,
                            n = e.offsetY;
                          this.viewGL && !this.viewGL.containPoint(i, n) || (r = "perspective" === this._projection ? Math.max(Math.max(Math.min(this._distance - this.minDistance, this.maxDistance - this._distance)) / 20, .5) : Math.max(Math.max(Math.min(this._orthoSize - this.minOrthographicSize, this.maxOrthographicSize - this._orthoSize)) / 20, .5), this._zoomSpeed = (t > 0 ? -1 : 1) * r * this.zoomSensitivity, this._rotating = !1, this.autoRotate && "rotate" === this._mode && this._startCountingStill(), e.event.preventDefault())
                        }
                      },
                      _mouseUpHandler: function () {
                        this.zr.off("mousemove", this._mouseMoveHandler), this.zr.off("mouseup", this._mouseUpHandler)
                      },
                      _isRightMouseButtonUsed: function () {
                        return "right" === this.rotateMouseButton || "right" === this.panMouseButton
                      },
                      _contextMenuHandler: function (e) {
                        this._isRightMouseButtonUsed() && e.preventDefault()
                      },
                      _addAnimator: function (e) {
                        var t = this._animators;
                        return t.push(e), e.done((function () {
                          var r = t.indexOf(e);
                          r >= 0 && t.splice(r, 1)
                        })), e
                      }
                    });
                    Object.defineProperty(Co.prototype, "autoRotate", {
                      get: function (e) {
                        return this._autoRotate
                      },
                      set: function (e) {
                        this._autoRotate = e, this._rotating = e
                      }
                    });
                    const Do = Co,
                      Lo = {
                        convertToDynamicArray: function (e) {
                          e && this.resetOffset();
                          var t = this.attributes;
                          for (var r in t) e || !t[r].value ? t[r].value = [] : t[r].value = Array.prototype.slice.call(t[r].value);
                          e || !this.indices ? this.indices = [] : this.indices = Array.prototype.slice.call(this.indices)
                        },
                        convertToTypedArray: function () {
                          var e = this.attributes;
                          for (var t in e) e[t].value && e[t].value.length > 0 ? e[t].value = new Float32Array(e[t].value) : e[t].value = null;
                          this.indices && this.indices.length > 0 && (this.indices = this.vertexCount > 65535 ? new Uint32Array(this.indices) : new Uint16Array(this.indices)), this.dirty()
                        }
                      },
                      Po = {
                        vec2: pe,
                        vec3: Qe,
                        vec4: Et,
                        mat2: Fn,
                        mat2d: kn,
                        mat3: Dt,
                        mat4: Ye,
                        quat: Rt
                      };
                    var Oo = Po.vec3,
                      No = [
                        [0, 0],
                        [1, 1]
                      ],
                      Io = Vr.extend((function () {
                        return {
                          segmentScale: 1,
                          dynamic: !0,
                          useNativeLine: !0,
                          attributes: {
                            position: new Vr.Attribute("position", "float", 3, "POSITION"),
                            positionPrev: new Vr.Attribute("positionPrev", "float", 3),
                            positionNext: new Vr.Attribute("positionNext", "float", 3),
                            prevPositionPrev: new Vr.Attribute("prevPositionPrev", "float", 3),
                            prevPosition: new Vr.Attribute("prevPosition", "float", 3),
                            prevPositionNext: new Vr.Attribute("prevPositionNext", "float", 3),
                            offset: new Vr.Attribute("offset", "float", 1),
                            color: new Vr.Attribute("color", "float", 4, "COLOR")
                          }
                        }
                      }), {
                        resetOffset: function () {
                          this._vertexOffset = 0, this._triangleOffset = 0, this._itemVertexOffsets = []
                        },
                        setVertexCount: function (e) {
                          var t = this.attributes;
                          this.vertexCount !== e && (t.position.init(e), t.color.init(e), this.useNativeLine || (t.positionPrev.init(e), t.positionNext.init(e), t.offset.init(e)), e > 65535 ? this.indices instanceof Uint16Array && (this.indices = new Uint32Array(this.indices)) : this.indices instanceof Uint32Array && (this.indices = new Uint16Array(this.indices)))
                        },
                        setTriangleCount: function (e) {
                          this.triangleCount !== e && (this.indices = 0 === e ? null : this.vertexCount > 65535 ? new Uint32Array(3 * e) : new Uint16Array(3 * e))
                        },
                        _getCubicCurveApproxStep: function (e, t, r, i) {
                          return 1 / (Oo.dist(e, t) + Oo.dist(r, t) + Oo.dist(i, r) + 1) * this.segmentScale
                        },
                        getCubicCurveVertexCount: function (e, t, r, i) {
                          var n = this._getCubicCurveApproxStep(e, t, r, i),
                            a = Math.ceil(1 / n);
                          return this.useNativeLine ? 2 * a : 2 * a + 2
                        },
                        getCubicCurveTriangleCount: function (e, t, r, i) {
                          var n = this._getCubicCurveApproxStep(e, t, r, i),
                            a = Math.ceil(1 / n);
                          return this.useNativeLine ? 0 : 2 * a
                        },
                        getLineVertexCount: function () {
                          return this.getPolylineVertexCount(No)
                        },
                        getLineTriangleCount: function () {
                          return this.getPolylineTriangleCount(No)
                        },
                        getPolylineVertexCount: function (e) {
                          var t;
                          return t = "number" == typeof e ? e : "number" != typeof e[0] ? e.length : e.length / 3, this.useNativeLine ? 2 * (t - 1) : 2 * (t - 1) + 2
                        },
                        getPolylineTriangleCount: function (e) {
                          var t;
                          return t = "number" == typeof e ? e : "number" != typeof e[0] ? e.length : e.length / 3, this.useNativeLine ? 0 : 2 * Math.max(t - 1, 0)
                        },
                        addCubicCurve: function (e, t, r, i, n, a) {
                          null == a && (a = 1);
                          var o = e[0],
                            s = e[1],
                            l = e[2],
                            h = t[0],
                            u = t[1],
                            c = t[2],
                            d = r[0],
                            f = r[1],
                            p = r[2],
                            m = i[0],
                            g = i[1],
                            _ = i[2],
                            v = this._getCubicCurveApproxStep(e, t, r, i),
                            y = v * v,
                            x = y * v,
                            b = 3 * v,
                            w = 3 * y,
                            T = 6 * y,
                            S = 6 * x,
                            M = o - 2 * h + d,
                            A = s - 2 * u + f,
                            E = l - 2 * c + p,
                            C = 3 * (h - d) - o + m,
                            D = 3 * (u - f) - s + g,
                            L = 3 * (c - p) - l + _,
                            P = o,
                            O = s,
                            N = l,
                            I = (h - o) * b + M * w + C * x,
                            R = (u - s) * b + A * w + D * x,
                            B = (c - l) * b + E * w + L * x,
                            F = M * T + C * S,
                            z = A * T + D * S,
                            G = E * T + L * S,
                            U = C * S,
                            k = D * S,
                            V = L * S,
                            H = 0,
                            W = 0,
                            j = Math.ceil(1 / v),
                            X = new Float32Array(3 * (j + 1)),
                            q = (X = [], 0);
                          for (W = 0; W < j + 1; W++) X[q++] = P, X[q++] = O, X[q++] = N, P += I, O += R, N += B, I += F, R += z, B += G, F += U, z += k, G += V, (H += v) > 1 && (P = I > 0 ? Math.min(P, m) : Math.max(P, m), O = R > 0 ? Math.min(O, g) : Math.max(O, g), N = B > 0 ? Math.min(N, _) : Math.max(N, _));
                          return this.addPolyline(X, n, a)
                        },
                        addLine: function (e, t, r, i) {
                          return this.addPolyline([e, t], r, i)
                        },
                        addPolyline: function (e, t, r, i, n) {
                          if (e.length) {
                            var a = "number" != typeof e[0];
                            if (null == n && (n = a ? e.length : e.length / 3), !(n < 2)) {
                              null == i && (i = 0), null == r && (r = 1), this._itemVertexOffsets.push(this._vertexOffset);
                              var o, s, l = (a = "number" != typeof e[0]) ? "number" != typeof t[0] : t.length / 4 === n,
                                h = this.attributes.position,
                                u = this.attributes.positionPrev,
                                c = this.attributes.positionNext,
                                d = this.attributes.color,
                                f = this.attributes.offset,
                                p = this.indices,
                                m = this._vertexOffset;
                              r = Math.max(r, .01);
                              for (var g = i; g < n; g++) {
                                if (a) o = e[g], s = l ? t[g] : t;
                                else {
                                  var _ = 3 * g;
                                  if ((o = o || [])[0] = e[_], o[1] = e[_ + 1], o[2] = e[_ + 2], l) {
                                    var v = 4 * g;
                                    (s = s || [])[0] = t[v], s[1] = t[v + 1], s[2] = t[v + 2], s[3] = t[v + 3]
                                  } else s = t
                                }
                                if (this.useNativeLine ? g > 1 && (h.copy(m, m - 1), d.copy(m, m - 1), m++) : (g < n - 1 && (u.set(m + 2, o), u.set(m + 3, o)), g > 0 && (c.set(m - 2, o), c.set(m - 1, o)), h.set(m, o), h.set(m + 1, o), d.set(m, s), d.set(m + 1, s), f.set(m, r / 2), f.set(m + 1, -r / 2), m += 2), this.useNativeLine) d.set(m, s), h.set(m, o), m++;
                                else if (g > 0) {
                                  var y = 3 * this._triangleOffset;
                                  (p = this.indices)[y] = m - 4, p[y + 1] = m - 3, p[y + 2] = m - 2, p[y + 3] = m - 3, p[y + 4] = m - 1, p[y + 5] = m - 2, this._triangleOffset += 2
                                }
                              }
                              if (!this.useNativeLine) {
                                var x = this._vertexOffset,
                                  b = this._vertexOffset + 2 * n;
                                u.copy(x, x + 2), u.copy(x + 1, x + 3), c.copy(b - 1, b - 3), c.copy(b - 2, b - 4)
                              }
                              return this._vertexOffset = m, this._vertexOffset
                            }
                          }
                        },
                        setItemColor: function (e, t) {
                          for (var r = this._itemVertexOffsets[e], i = e < this._itemVertexOffsets.length - 1 ? this._itemVertexOffsets[e + 1] : this._vertexOffset, n = r; n < i; n++) this.attributes.color.set(n, t);
                          this.dirty("color")
                        },
                        currentTriangleOffset: function () {
                          return this._triangleOffset
                        },
                        currentVertexOffset: function () {
                          return this._vertexOffset
                        }
                      });
                    i.util.defaults(Io.prototype, Lo);
                    const Ro = Io;

                    function Bo(e, t, r, i, n, a, o) {
                      this._zr = e, this._x = 0, this._y = 0, this._rowHeight = 0, this.width = i, this.height = n, this.offsetX = t, this.offsetY = r, this.dpr = o, this.gap = a
                    }

                    function Fo(e) {
                      (e = e || {}).width = e.width || 512, e.height = e.height || 512, e.devicePixelRatio = e.devicePixelRatio || 1, e.gap = null == e.gap ? 2 : e.gap;
                      var t = document.createElement("canvas");
                      t.width = e.width * e.devicePixelRatio, t.height = e.height * e.devicePixelRatio, this._canvas = t, this._texture = new Dr({
                        image: t,
                        flipY: !1
                      });
                      var r = this;
                      this._zr = i.zrender.init(t);
                      var n = this._zr.refreshImmediately;
                      this._zr.refreshImmediately = function () {
                        n.call(this), r._texture.dirty(), r.onupdate && r.onupdate()
                      }, this._dpr = e.devicePixelRatio, this._coords = {}, this.onupdate = e.onupdate, this._gap = e.gap, this._textureAtlasNodes = [new Bo(this._zr, 0, 0, e.width, e.height, this._gap, this._dpr)], this._nodeWidth = e.width, this._nodeHeight = e.height, this._currentNodeIdx = 0
                    }
                    Bo.prototype = {
                      constructor: Bo,
                      clear: function () {
                        this._x = 0, this._y = 0, this._rowHeight = 0
                      },
                      add: function (e, t, r) {
                        var i = e.getBoundingRect();
                        null == t && (t = i.width), null == r && (r = i.height), t *= this.dpr, r *= this.dpr, this._fitElement(e, t, r);
                        var n = this._x,
                          a = this._y,
                          o = this.width * this.dpr,
                          s = this.height * this.dpr,
                          l = this.gap;
                        if (n + t + l > o && (n = this._x = 0, a += this._rowHeight + l, this._y = a, this._rowHeight = 0), this._x += t + l, this._rowHeight = Math.max(this._rowHeight, r), a + r + l > s) return null;
                        e.x += this.offsetX * this.dpr + n, e.y += this.offsetY * this.dpr + a, this._zr.add(e);
                        var h = [this.offsetX / this.width, this.offsetY / this.height];
                        return [
                          [n / o + h[0], a / s + h[1]],
                          [(n + t) / o + h[0], (a + r) / s + h[1]]
                        ]
                      },
                      _fitElement: function (e, t, r) {
                        var i = e.getBoundingRect(),
                          n = t / i.width,
                          a = r / i.height;
                        e.x = -i.x * n, e.y = -i.y * a, e.scaleX = n, e.scaleY = a, e.update()
                      }
                    }, Fo.prototype = {
                      clear: function () {
                        for (var e = 0; e < this._textureAtlasNodes.length; e++) this._textureAtlasNodes[e].clear();
                        this._currentNodeIdx = 0, this._zr.clear(), this._coords = {}
                      },
                      getWidth: function () {
                        return this._width
                      },
                      getHeight: function () {
                        return this._height
                      },
                      getTexture: function () {
                        return this._texture
                      },
                      getDevicePixelRatio: function () {
                        return this._dpr
                      },
                      getZr: function () {
                        return this._zr
                      },
                      _getCurrentNode: function () {
                        return this._textureAtlasNodes[this._currentNodeIdx]
                      },
                      _expand: function () {
                        if (this._currentNodeIdx++, this._textureAtlasNodes[this._currentNodeIdx]) return this._textureAtlasNodes[this._currentNodeIdx];
                        var e = 4096 / this._dpr,
                          t = this._textureAtlasNodes.length,
                          r = t * this._nodeWidth % e,
                          i = Math.floor(t * this._nodeWidth / e) * this._nodeHeight;
                        if (!(i >= e)) {
                          var n = (r + this._nodeWidth) * this._dpr,
                            a = (i + this._nodeHeight) * this._dpr;
                          try {
                            this._zr.resize({
                              width: n,
                              height: a
                            })
                          } catch (e) {
                            this._canvas.width = n, this._canvas.height = a
                          }
                          var o = new Bo(this._zr, r, i, this._nodeWidth, this._nodeHeight, this._gap, this._dpr);
                          return this._textureAtlasNodes.push(o), o
                        }
                      },
                      add: function (e, t, r) {
                        if (this._coords[e.id]) return this._coords[e.id];
                        var i = this._getCurrentNode().add(e, t, r);
                        if (!i) {
                          var n = this._expand();
                          if (!n) return;
                          i = n.add(e, t, r)
                        }
                        return this._coords[e.id] = i, i
                      },
                      getCoordsScale: function () {
                        var e = this._dpr;
                        return [this._nodeWidth / this._canvas.width * e, this._nodeHeight / this._canvas.height * e]
                      },
                      getCoords: function (e) {
                        return this._coords[e]
                      },
                      dispose: function () {
                        this._zr.dispose()
                      }
                    };
                    const zo = Fo;

                    function Go() {}
                    Go.prototype = {
                      constructor: Go,
                      setScene: function (e) {
                        this._scene = e, this._skybox && this._skybox.attachScene(this._scene)
                      },
                      initLight: function (e) {
                        this._lightRoot = e, this.mainLight = new Ka.DirectionalLight({
                          shadowBias: .005
                        }), this.ambientLight = new Ka.AmbientLight, e.add(this.mainLight), e.add(this.ambientLight)
                      },
                      dispose: function () {
                        this._lightRoot && (this._lightRoot.remove(this.mainLight), this._lightRoot.remove(this.ambientLight))
                      },
                      updateLight: function (e) {
                        var t = this.mainLight,
                          r = this.ambientLight,
                          i = e.getModel("light"),
                          n = i.getModel("main"),
                          a = i.getModel("ambient");
                        t.intensity = n.get("intensity"), r.intensity = a.get("intensity"), t.color = Ka.parseColor(n.get("color")).slice(0, 3), r.color = Ka.parseColor(a.get("color")).slice(0, 3);
                        var o = n.get("alpha") || 0,
                          s = n.get("beta") || 0;
                        t.position.setArray(Ka.directionFromAlphaBeta(o, s)), t.lookAt(Ka.Vector3.ZERO), t.castShadow = n.get("shadow"), t.shadowResolution = Ka.getShadowResolution(n.get("shadowQuality"))
                      },
                      updateAmbientCubemap: function (e, t, r) {
                        var i = t.getModel("light.ambientCubemap"),
                          n = i.get("texture");
                        if (n) {
                          this._cubemapLightsCache = this._cubemapLightsCache || {};
                          var a = this._cubemapLightsCache[n];
                          if (!a) {
                            var o = this;
                            a = this._cubemapLightsCache[n] = Ka.createAmbientCubemap(i.option, e, r, (function () {
                              o._isSkyboxFromAmbientCubemap && o._skybox.setEnvironmentMap(a.specular.cubemap), r.getZr().refresh()
                            }))
                          }
                          this._lightRoot.add(a.diffuse), this._lightRoot.add(a.specular), this._currentCubemapLights = a
                        } else this._currentCubemapLights && (this._lightRoot.remove(this._currentCubemapLights.diffuse), this._lightRoot.remove(this._currentCubemapLights.specular), this._currentCubemapLights = null)
                      },
                      updateSkybox: function (e, t, r) {
                        var n = t.get("environment"),
                          a = this,
                          o = (a._skybox = a._skybox || new ji, a._skybox);
                        if (n && "none" !== n)
                          if ("auto" === n)
                            if (this._isSkyboxFromAmbientCubemap = !0, this._currentCubemapLights) {
                              var s = this._currentCubemapLights.specular.cubemap;
                              o.setEnvironmentMap(s), this._scene && o.attachScene(this._scene), o.material.set("lod", 3)
                            } else this._skybox && this._skybox.detachScene();
                        else if ("object" == typeof n && n.colorStops || "string" == typeof n && i.color.parse(n)) {
                          this._isSkyboxFromAmbientCubemap = !1;
                          var l = new Ka.Texture2D({
                            anisotropic: 8,
                            flipY: !1
                          });
                          o.setEnvironmentMap(l);
                          var h = l.image = document.createElement("canvas");
                          h.width = h.height = 16;
                          var u = h.getContext("2d"),
                            c = new i.graphic.Rect({
                              shape: {
                                x: 0,
                                y: 0,
                                width: 16,
                                height: 16
                              },
                              style: {
                                fill: n
                              }
                            });
                          i.innerDrawElementOnCanvas(u, c), o.attachScene(this._scene)
                        } else this._isSkyboxFromAmbientCubemap = !1, l = Ka.loadTexture(n, r, {
                          anisotropic: 8,
                          flipY: !1
                        }), o.setEnvironmentMap(l), o.attachScene(this._scene);
                        else this._skybox && this._skybox.detachScene(this._scene), this._skybox = null;
                        var d = t.coordinateSystem;
                        if (this._skybox)
                          if (!d || !d.viewGL || "auto" === n || n.match && n.match(/.hdr$/)) this._skybox.material.undefine("fragment", "SRGB_DECODE");
                          else {
                            var f = d.viewGL.isLinearSpace() ? "define" : "undefine";
                            this._skybox.material[f]("fragment", "SRGB_DECODE")
                          }
                      }
                    };
                    const Uo = Go;
                    var ko = Po.vec3,
                      Vo = Vr.extend((function () {
                        return {
                          segmentScale: 1,
                          useNativeLine: !0,
                          attributes: {
                            position: new Vr.Attribute("position", "float", 3, "POSITION"),
                            normal: new Vr.Attribute("normal", "float", 3, "NORMAL"),
                            color: new Vr.Attribute("color", "float", 4, "COLOR")
                          }
                        }
                      }), {
                        resetOffset: function () {
                          this._vertexOffset = 0, this._faceOffset = 0
                        },
                        setQuadCount: function (e) {
                          var t = this.attributes,
                            r = this.getQuadVertexCount() * e,
                            i = this.getQuadTriangleCount() * e;
                          this.vertexCount !== r && (t.position.init(r), t.normal.init(r), t.color.init(r)), this.triangleCount !== i && (this.indices = r > 65535 ? new Uint32Array(3 * i) : new Uint16Array(3 * i))
                        },
                        getQuadVertexCount: function () {
                          return 4
                        },
                        getQuadTriangleCount: function () {
                          return 2
                        },
                        addQuad: function () {
                          var e = ko.create(),
                            t = ko.create(),
                            r = ko.create(),
                            i = [0, 3, 1, 3, 2, 1];
                          return function (n, a) {
                            var o = this.attributes.position,
                              s = this.attributes.normal,
                              l = this.attributes.color;
                            ko.sub(e, n[1], n[0]), ko.sub(t, n[2], n[1]), ko.cross(r, e, t), ko.normalize(r, r);
                            for (var h = 0; h < 4; h++) o.set(this._vertexOffset + h, n[h]), l.set(this._vertexOffset + h, a), s.set(this._vertexOffset + h, r);
                            var u = 3 * this._faceOffset;
                            for (h = 0; h < 6; h++) this.indices[u + h] = i[h] + this._vertexOffset;
                            this._vertexOffset += 4, this._faceOffset += 2
                          }
                        }()
                      });
                    i.util.defaults(Vo.prototype, Lo);
                    const Ho = Vo;
                    var Wo = Mn,
                      jo = {
                        x: 0,
                        y: 2,
                        z: 1
                      };

                    function Xo(e, t, r) {
                      this.rootNode = new Ka.Node;
                      var i = new Ka.Mesh({
                          geometry: new Ro({
                            useNativeLine: !1
                          }),
                          material: t,
                          castShadow: !1,
                          ignorePicking: !0,
                          $ignorePicking: !0,
                          renderOrder: 1
                        }),
                        n = new Ka.Mesh({
                          geometry: new Ho,
                          material: r,
                          castShadow: !1,
                          culling: !1,
                          ignorePicking: !0,
                          $ignorePicking: !0,
                          renderOrder: 0
                        });
                      this.rootNode.add(n), this.rootNode.add(i), this.faceInfo = e, this.plane = new Ka.Plane, this.linesMesh = i, this.quadsMesh = n
                    }
                    Xo.prototype.update = function (e, t, r) {
                      var i = e.coordinateSystem,
                        n = [i.getAxis(this.faceInfo[0]), i.getAxis(this.faceInfo[1])],
                        a = this.linesMesh.geometry,
                        o = this.quadsMesh.geometry;
                      a.convertToDynamicArray(!0), o.convertToDynamicArray(!0), this._updateSplitLines(a, n, e, r), this._udpateSplitAreas(o, n, e, r), a.convertToTypedArray(), o.convertToTypedArray();
                      var s = i.getAxis(this.faceInfo[2]);
                      ! function (e, t, r, i) {
                        var n = [0, 0, 0],
                          a = i < 0 ? r.getExtentMin() : r.getExtentMax();
                        n[jo[r.dim]] = a, e.position.setArray(n), e.rotation.identity(), t.distance = -Math.abs(a), t.normal.set(0, 0, 0), "x" === r.dim ? (e.rotation.rotateY(i * Math.PI / 2), t.normal.x = -i) : "z" === r.dim ? (e.rotation.rotateX(-i * Math.PI / 2), t.normal.y = -i) : (i > 0 && e.rotation.rotateY(Math.PI), t.normal.z = -i)
                      }(this.rootNode, this.plane, s, this.faceInfo[3])
                    }, Xo.prototype._updateSplitLines = function (e, t, r, n) {
                      var a = n.getDevicePixelRatio();
                      t.forEach((function (n, o) {
                        var s = n.model,
                          l = t[1 - o].getExtent();
                        if (!n.scale.isBlank()) {
                          var h = s.getModel("splitLine", r.getModel("splitLine"));
                          if (h.get("show")) {
                            var u = h.getModel("lineStyle"),
                              c = u.get("color"),
                              d = Wo(u.get("opacity"), 1),
                              f = Wo(u.get("width"), 1);
                            c = i.util.isArray(c) ? c : [c];
                            for (var p = n.getTicksCoords({
                                tickModel: h
                              }), m = 0, g = 0; g < p.length; g++) {
                              var _ = p[g].coord,
                                v = Ka.parseColor(c[m % c.length]);
                              v[3] *= d;
                              var y = [0, 0, 0],
                                x = [0, 0, 0];
                              y[o] = x[o] = _, y[1 - o] = l[0], x[1 - o] = l[1], e.addLine(y, x, v, f * a), m++
                            }
                          }
                        }
                      }))
                    }, Xo.prototype._udpateSplitAreas = function (e, t, r, n) {
                      t.forEach((function (n, a) {
                        var o = n.model,
                          s = t[1 - a].getExtent();
                        if (!n.scale.isBlank()) {
                          var l = o.getModel("splitArea", r.getModel("splitArea"));
                          if (l.get("show")) {
                            var h = l.getModel("areaStyle"),
                              u = h.get("color"),
                              c = Wo(h.get("opacity"), 1);
                            u = i.util.isArray(u) ? u : [u];
                            for (var d = n.getTicksCoords({
                                tickModel: l,
                                clamp: !0
                              }), f = 0, p = [0, 0, 0], m = [0, 0, 0], g = 0; g < d.length; g++) {
                              var _ = d[g].coord,
                                v = [0, 0, 0],
                                y = [0, 0, 0];
                              if (v[a] = y[a] = _, v[1 - a] = s[0], y[1 - a] = s[1], 0 !== g) {
                                var x = Ka.parseColor(u[f % u.length]);
                                x[3] *= c, e.addQuad([p, v, y, m], x), p = v, m = y, f++
                              } else p = v, m = y
                            }
                          }
                        }
                      }))
                    };
                    const qo = Xo;
                    var Zo = [0, 1, 2, 0, 2, 3],
                      Yo = Vr.extend((function () {
                        return {
                          attributes: {
                            position: new Vr.Attribute("position", "float", 3, "POSITION"),
                            texcoord: new Vr.Attribute("texcoord", "float", 2, "TEXCOORD_0"),
                            offset: new Vr.Attribute("offset", "float", 2),
                            color: new Vr.Attribute("color", "float", 4, "COLOR")
                          }
                        }
                      }), {
                        resetOffset: function () {
                          this._vertexOffset = 0, this._faceOffset = 0
                        },
                        setSpriteCount: function (e) {
                          this._spriteCount = e;
                          var t = 4 * e,
                            r = 2 * e;
                          this.vertexCount !== t && (this.attributes.position.init(t), this.attributes.offset.init(t), this.attributes.color.init(t)), this.triangleCount !== r && (this.indices = t > 65535 ? new Uint32Array(3 * r) : new Uint16Array(3 * r))
                        },
                        setSpriteAlign: function (e, t, r, i, n) {
                          var a, o, s, l;
                          switch (null == r && (r = "left"), null == i && (i = "top"), n = n || 0, r) {
                            case "left":
                              a = n, s = t[0] + n;
                              break;
                            case "center":
                            case "middle":
                              a = -t[0] / 2, s = t[0] / 2;
                              break;
                            case "right":
                              a = -t[0] - n, s = -n
                          }
                          switch (i) {
                            case "bottom":
                              o = n, l = t[1] + n;
                              break;
                            case "middle":
                              o = -t[1] / 2, l = t[1] / 2;
                              break;
                            case "top":
                              o = -t[1] - n, l = -n
                          }
                          var h = 4 * e,
                            u = this.attributes.offset;
                          u.set(h, [a, l]), u.set(h + 1, [s, l]), u.set(h + 2, [s, o]), u.set(h + 3, [a, o])
                        },
                        addSprite: function (e, t, r, i, n, a) {
                          var o = this._vertexOffset;
                          this.setSprite(this._vertexOffset / 4, e, t, r, i, n, a);
                          for (var s = 0; s < Zo.length; s++) this.indices[3 * this._faceOffset + s] = Zo[s] + o;
                          return this._faceOffset += 2, this._vertexOffset += 4, o / 4
                        },
                        setSprite: function (e, t, r, i, n, a, o) {
                          for (var s = 4 * e, l = this.attributes, h = 0; h < 4; h++) l.position.set(s + h, t);
                          var u = l.texcoord;
                          u.set(s, [i[0][0], i[0][1]]), u.set(s + 1, [i[1][0], i[0][1]]), u.set(s + 2, [i[1][0], i[1][1]]), u.set(s + 3, [i[0][0], i[1][1]]), this.setSpriteAlign(e, r, n, a, o)
                        }
                      });
                    i.util.defaults(Yo.prototype, Lo);
                    const Ko = Yo;
                    Ka.Shader.import("@export ecgl.labels.vertex\n\nattribute vec3 position: POSITION;\nattribute vec2 texcoord: TEXCOORD_0;\nattribute vec2 offset;\n#ifdef VERTEX_COLOR\nattribute vec4 a_Color : COLOR;\nvarying vec4 v_Color;\n#endif\n\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\nuniform vec4 viewport : VIEWPORT;\n\nvarying vec2 v_Texcoord;\n\nvoid main()\n{\n vec4 proj = worldViewProjection * vec4(position, 1.0);\n\n vec2 screen = (proj.xy / abs(proj.w) + 1.0) * 0.5 * viewport.zw;\n\n screen += offset;\n\n proj.xy = (screen / viewport.zw - 0.5) * 2.0 * abs(proj.w);\n gl_Position = proj;\n#ifdef VERTEX_COLOR\n v_Color = a_Color;\n#endif\n v_Texcoord = texcoord;\n}\n@end\n\n\n@export ecgl.labels.fragment\n\nuniform vec3 color : [1.0, 1.0, 1.0];\nuniform float alpha : 1.0;\nuniform sampler2D textureAtlas;\nuniform vec2 uvScale: [1.0, 1.0];\n\n#ifdef VERTEX_COLOR\nvarying vec4 v_Color;\n#endif\nvarying float v_Miter;\n\nvarying vec2 v_Texcoord;\n\nvoid main()\n{\n gl_FragColor = vec4(color, alpha) * texture2D(textureAtlas, v_Texcoord * uvScale);\n#ifdef VERTEX_COLOR\n gl_FragColor *= v_Color;\n#endif\n}\n\n@end");
                    const Qo = Ka.Mesh.extend((function () {
                      return {
                        geometry: new Ko({
                          dynamic: !0
                        }),
                        material: new Ka.Material({
                          shader: Ka.createShader("ecgl.labels"),
                          transparent: !0,
                          depthMask: !1
                        }),
                        culling: !1,
                        castShadow: !1,
                        ignorePicking: !0
                      }
                    }));
                    var Jo = Mn,
                      $o = {
                        x: 0,
                        y: 2,
                        z: 1
                      };

                    function es(e, t) {
                      var r = new Ka.Mesh({
                          geometry: new Ro({
                            useNativeLine: !1
                          }),
                          material: t,
                          castShadow: !1,
                          ignorePicking: !0,
                          renderOrder: 2
                        }),
                        i = new Qo;
                      i.material.depthMask = !1;
                      var n = new Ka.Node;
                      n.add(r), n.add(i), this.rootNode = n, this.dim = e, this.linesMesh = r, this.labelsMesh = i, this.axisLineCoords = null, this.labelElements = []
                    }
                    var ts = {
                      x: "y",
                      y: "x",
                      z: "y"
                    };
                    es.prototype.update = function (e, t, r) {
                      var n = e.coordinateSystem.getAxis(this.dim),
                        a = this.linesMesh.geometry,
                        o = this.labelsMesh.geometry;
                      a.convertToDynamicArray(!0), o.convertToDynamicArray(!0);
                      var s = n.model,
                        l = n.getExtent(),
                        h = r.getDevicePixelRatio(),
                        u = s.getModel("axisLine", e.getModel("axisLine")),
                        c = s.getModel("axisTick", e.getModel("axisTick")),
                        d = s.getModel("axisLabel", e.getModel("axisLabel")),
                        f = u.get("lineStyle.color");
                      if (u.get("show")) {
                        var p = u.getModel("lineStyle"),
                          m = [0, 0, 0];
                        (M = [0, 0, 0])[A = $o[n.dim]] = l[0], m[A] = l[1], this.axisLineCoords = [M, m];
                        var g = Ka.parseColor(f),
                          _ = Jo(p.get("width"), 1),
                          v = Jo(p.get("opacity"), 1);
                        g[3] *= v, a.addLine(M, m, g, _ * h)
                      }
                      if (c.get("show")) {
                        var y = c.getModel("lineStyle"),
                          x = Ka.parseColor(Jo(y.get("color"), f));
                        _ = Jo(y.get("width"), 1), x[3] *= Jo(y.get("opacity"), 1);
                        for (var b = n.getTicksCoords(), w = c.get("length"), T = 0; T < b.length; T++) {
                          var S = b[T].coord,
                            M = [0, 0, 0],
                            A = (m = [0, 0, 0], $o[n.dim]),
                            E = $o[ts[n.dim]];
                          M[A] = m[A] = S, m[E] = w, a.addLine(M, m, x, _ * h)
                        }
                      }
                      if (this.labelElements = [], h = r.getDevicePixelRatio(), d.get("show")) {
                        b = n.getTicksCoords();
                        var C = s.get("data"),
                          D = d.get("margin"),
                          L = n.getViewLabels();
                        for (T = 0; T < L.length; T++) {
                          var P = L[T].tickValue,
                            O = L[T].formattedLabel,
                            N = L[T].rawLabel,
                            I = (S = n.dataToCoord(P), [0, 0, 0]);
                          A = $o[n.dim], E = $o[ts[n.dim]], I[A] = I[A] = S, I[E] = D;
                          var R = d;
                          C && C[P] && C[P].textStyle && (R = new i.Model(C[P].textStyle, d, s.ecModel));
                          var B = Jo(R.get("color"), f),
                            F = new i.graphic.Text({
                              style: xo(R, {
                                text: O,
                                fill: "function" == typeof B ? B("category" === n.type ? N : "value" === n.type ? P + "" : P, T) : B,
                                verticalAlign: "top",
                                align: "left"
                              })
                            }),
                            z = t.add(F),
                            G = F.getBoundingRect();
                          o.addSprite(I, [G.width * h, G.height * h], z), this.labelElements.push(F)
                        }
                      }
                      if (s.get("name")) {
                        var U = s.getModel("nameTextStyle"),
                          k = (I = [0, 0, 0], A = $o[n.dim], E = $o[ts[n.dim]], Jo(U.get("color"), f)),
                          V = U.get("borderColor");
                        _ = U.get("borderWidth"), I[A] = I[A] = (l[0] + l[1]) / 2, I[E] = s.get("nameGap"), F = new i.graphic.Text({
                          style: xo(U, {
                            text: s.get("name"),
                            fill: k,
                            stroke: V,
                            lineWidth: _
                          })
                        }), z = t.add(F), G = F.getBoundingRect(), o.addSprite(I, [G.width * h, G.height * h], z), F.__idx = this.labelElements.length, this.nameLabelElement = F
                      }
                      this.labelsMesh.material.set("textureAtlas", t.getTexture()), this.labelsMesh.material.set("uvScale", t.getCoordsScale()), a.convertToTypedArray(), o.convertToTypedArray()
                    }, es.prototype.setSpriteAlign = function (e, t, r) {
                      for (var i = r.getDevicePixelRatio(), n = this.labelsMesh.geometry, a = 0; a < this.labelElements.length; a++) {
                        var o = this.labelElements[a].getBoundingRect();
                        n.setSpriteAlign(a, [o.width * i, o.height * i], e, t)
                      }
                      var s = this.nameLabelElement;
                      s && (o = s.getBoundingRect(), n.setSpriteAlign(s.__idx, [o.width * i, o.height * i], e, t), n.dirty()), this.textAlign = e, this.textVerticalAlign = t
                    };
                    const rs = es,
                      is = "@export ecgl.lines3D.vertex\n\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\n\nattribute vec3 position: POSITION;\nattribute vec4 a_Color : COLOR;\nvarying vec4 v_Color;\n\nvoid main()\n{\n gl_Position = worldViewProjection * vec4(position, 1.0);\n v_Color = a_Color;\n}\n\n@end\n\n@export ecgl.lines3D.fragment\n\nuniform vec4 color : [1.0, 1.0, 1.0, 1.0];\n\nvarying vec4 v_Color;\n\n@import clay.util.srgb\n\nvoid main()\n{\n#ifdef SRGB_DECODE\n gl_FragColor = sRGBToLinear(color * v_Color);\n#else\n gl_FragColor = color * v_Color;\n#endif\n}\n@end\n\n\n\n@export ecgl.lines3D.clipNear\n\nvec4 clipNear(vec4 p1, vec4 p2) {\n float n = (p1.w - near) / (p1.w - p2.w);\n return vec4(mix(p1.xy, p2.xy, n), -near, near);\n}\n\n@end\n\n@export ecgl.lines3D.expandLine\n#ifdef VERTEX_ANIMATION\n vec4 prevProj = worldViewProjection * vec4(mix(prevPositionPrev, positionPrev, percent), 1.0);\n vec4 currProj = worldViewProjection * vec4(mix(prevPosition, position, percent), 1.0);\n vec4 nextProj = worldViewProjection * vec4(mix(prevPositionNext, positionNext, percent), 1.0);\n#else\n vec4 prevProj = worldViewProjection * vec4(positionPrev, 1.0);\n vec4 currProj = worldViewProjection * vec4(position, 1.0);\n vec4 nextProj = worldViewProjection * vec4(positionNext, 1.0);\n#endif\n\n if (currProj.w < 0.0) {\n if (nextProj.w > 0.0) {\n currProj = clipNear(currProj, nextProj);\n }\n else if (prevProj.w > 0.0) {\n currProj = clipNear(currProj, prevProj);\n }\n }\n\n vec2 prevScreen = (prevProj.xy / abs(prevProj.w) + 1.0) * 0.5 * viewport.zw;\n vec2 currScreen = (currProj.xy / abs(currProj.w) + 1.0) * 0.5 * viewport.zw;\n vec2 nextScreen = (nextProj.xy / abs(nextProj.w) + 1.0) * 0.5 * viewport.zw;\n\n vec2 dir;\n float len = offset;\n if (position == positionPrev) {\n dir = normalize(nextScreen - currScreen);\n }\n else if (position == positionNext) {\n dir = normalize(currScreen - prevScreen);\n }\n else {\n vec2 dirA = normalize(currScreen - prevScreen);\n vec2 dirB = normalize(nextScreen - currScreen);\n\n vec2 tanget = normalize(dirA + dirB);\n\n float miter = 1.0 / max(dot(tanget, dirA), 0.5);\n len *= miter;\n dir = tanget;\n }\n\n dir = vec2(-dir.y, dir.x) * len;\n currScreen += dir;\n\n currProj.xy = (currScreen / viewport.zw - 0.5) * 2.0 * abs(currProj.w);\n@end\n\n\n@export ecgl.meshLines3D.vertex\n\nattribute vec3 position: POSITION;\nattribute vec3 positionPrev;\nattribute vec3 positionNext;\nattribute float offset;\nattribute vec4 a_Color : COLOR;\n\n#ifdef VERTEX_ANIMATION\nattribute vec3 prevPosition;\nattribute vec3 prevPositionPrev;\nattribute vec3 prevPositionNext;\nuniform float percent : 1.0;\n#endif\n\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\nuniform vec4 viewport : VIEWPORT;\nuniform float near : NEAR;\n\nvarying vec4 v_Color;\n\n@import ecgl.common.wireframe.vertexHeader\n\n@import ecgl.lines3D.clipNear\n\nvoid main()\n{\n @import ecgl.lines3D.expandLine\n\n gl_Position = currProj;\n\n v_Color = a_Color;\n\n @import ecgl.common.wireframe.vertexMain\n}\n@end\n\n\n@export ecgl.meshLines3D.fragment\n\nuniform vec4 color : [1.0, 1.0, 1.0, 1.0];\n\nvarying vec4 v_Color;\n\n@import ecgl.common.wireframe.fragmentHeader\n\n@import clay.util.srgb\n\nvoid main()\n{\n#ifdef SRGB_DECODE\n gl_FragColor = sRGBToLinear(color * v_Color);\n#else\n gl_FragColor = color * v_Color;\n#endif\n\n @import ecgl.common.wireframe.fragmentMain\n}\n\n@end";
                    var ns = Mn;
                    Ka.Shader.import(is);
                    var as = {
                      x: 0,
                      y: 2,
                      z: 1
                    };
                    const os = i.ComponentView.extend({
                        type: "grid3D",
                        __ecgl__: !0,
                        init: function (e, t) {
                          var r = new Ka.Material({
                              shader: Ka.createShader("ecgl.color"),
                              depthMask: !1,
                              transparent: !0
                            }),
                            i = new Ka.Material({
                              shader: Ka.createShader("ecgl.meshLines3D"),
                              depthMask: !1,
                              transparent: !0
                            });
                          r.define("fragment", "DOUBLE_SIDED"), r.define("both", "VERTEX_COLOR"), this.groupGL = new Ka.Node, this._control = new Do({
                            zr: t.getZr()
                          }), this._control.init(), this._faces = [
                            ["y", "z", "x", -1, "left"],
                            ["y", "z", "x", 1, "right"],
                            ["x", "y", "z", -1, "bottom"],
                            ["x", "y", "z", 1, "top"],
                            ["x", "z", "y", -1, "far"],
                            ["x", "z", "y", 1, "near"]
                          ].map((function (e) {
                            var t = new qo(e, i, r);
                            return this.groupGL.add(t.rootNode), t
                          }), this), this._axes = ["x", "y", "z"].map((function (e) {
                            var t = new rs(e, i);
                            return this.groupGL.add(t.rootNode), t
                          }), this);
                          var n = t.getDevicePixelRatio();
                          this._axisLabelSurface = new zo({
                            width: 256,
                            height: 256,
                            devicePixelRatio: n
                          }), this._axisLabelSurface.onupdate = function () {
                            t.getZr().refresh()
                          }, this._axisPointerLineMesh = new Ka.Mesh({
                            geometry: new Ro({
                              useNativeLine: !1
                            }),
                            material: i,
                            castShadow: !1,
                            ignorePicking: !0,
                            renderOrder: 3
                          }), this.groupGL.add(this._axisPointerLineMesh), this._axisPointerLabelsSurface = new zo({
                            width: 128,
                            height: 128,
                            devicePixelRatio: n
                          }), this._axisPointerLabelsMesh = new Qo({
                            ignorePicking: !0,
                            renderOrder: 4,
                            castShadow: !1
                          }), this._axisPointerLabelsMesh.material.set("textureAtlas", this._axisPointerLabelsSurface.getTexture()), this.groupGL.add(this._axisPointerLabelsMesh), this._lightRoot = new Ka.Node, this._sceneHelper = new Uo, this._sceneHelper.initLight(this._lightRoot)
                        },
                        render: function (e, t, r) {
                          this._model = e, this._api = r;
                          var i = e.coordinateSystem;
                          i.viewGL.add(this._lightRoot), e.get("show") ? i.viewGL.add(this.groupGL) : i.viewGL.remove(this.groupGL);
                          var n = this._control;
                          n.setViewGL(i.viewGL);
                          var a = e.getModel("viewControl");
                          n.setFromViewControlModel(a, 0), this._axisLabelSurface.clear(), n.off("update"), e.get("show") && (this._faces.forEach((function (i) {
                            i.update(e, t, r)
                          }), this), this._axes.forEach((function (t) {
                            t.update(e, this._axisLabelSurface, r)
                          }), this)), n.on("update", this._onCameraChange.bind(this, e, r), this), this._sceneHelper.setScene(i.viewGL.scene), this._sceneHelper.updateLight(e), i.viewGL.setPostEffect(e.getModel("postEffect"), r), i.viewGL.setTemporalSuperSampling(e.getModel("temporalSuperSampling")), this._initMouseHandler(e)
                        },
                        afterRender: function (e, t, r, i) {
                          var n = i.renderer;
                          this._sceneHelper.updateAmbientCubemap(n, e, r), this._sceneHelper.updateSkybox(n, e, r)
                        },
                        showAxisPointer: function (e, t, r, i) {
                          this._doShowAxisPointer(), this._updateAxisPointer(i.value)
                        },
                        hideAxisPointer: function (e, t, r, i) {
                          this._doHideAxisPointer()
                        },
                        _initMouseHandler: function (e) {
                          var t = e.coordinateSystem.viewGL;
                          e.get("show") && e.get("axisPointer.show") ? t.on("mousemove", this._updateAxisPointerOnMousePosition, this) : t.off("mousemove", this._updateAxisPointerOnMousePosition)
                        },
                        _updateAxisPointerOnMousePosition: function (e) {
                          if (!e.target) {
                            for (var t, r = this._model.coordinateSystem, i = r.viewGL, n = i.castRay(e.offsetX, e.offsetY, new Ka.Ray), a = 0; a < this._faces.length; a++) {
                              var o = this._faces[a];
                              if (!o.rootNode.invisible) {
                                o.plane.normal.dot(i.camera.worldTransform.z) < 0 && o.plane.normal.negate();
                                var s = n.intersectPlane(o.plane);
                                if (s) {
                                  var l = r.getAxis(o.faceInfo[0]),
                                    h = r.getAxis(o.faceInfo[1]),
                                    u = as[o.faceInfo[0]],
                                    c = as[o.faceInfo[1]];
                                  l.contain(s.array[u]) && h.contain(s.array[c]) && (t = s)
                                }
                              }
                            }
                            if (t) {
                              var d = r.pointToData(t.array, [], !0);
                              this._updateAxisPointer(d), this._doShowAxisPointer()
                            } else this._doHideAxisPointer()
                          }
                        },
                        _onCameraChange: function (e, t) {
                          e.get("show") && (this._updateFaceVisibility(), this._updateAxisLinePosition());
                          var r = this._control;
                          t.dispatchAction({
                            type: "grid3DChangeCamera",
                            alpha: r.getAlpha(),
                            beta: r.getBeta(),
                            distance: r.getDistance(),
                            center: r.getCenter(),
                            from: this.uid,
                            grid3DId: e.id
                          })
                        },
                        _updateFaceVisibility: function () {
                          var e = this._control.getCamera(),
                            t = new Ka.Vector3;
                          e.update();
                          for (var r = 0; r < this._faces.length / 2; r++) {
                            for (var i = [], n = 0; n < 2; n++) this._faces[2 * r + n].rootNode.getWorldPosition(t), t.transformMat4(e.viewMatrix), i[n] = t.z;
                            var a = i[0] > i[1] ? 0 : 1,
                              o = this._faces[2 * r + a],
                              s = this._faces[2 * r + 1 - a];
                            o.rootNode.invisible = !0, s.rootNode.invisible = !1
                          }
                        },
                        _updateAxisLinePosition: function () {
                          var e = this._model.coordinateSystem,
                            t = e.getAxis("x"),
                            r = e.getAxis("y"),
                            i = e.getAxis("z"),
                            n = i.getExtentMax(),
                            a = i.getExtentMin(),
                            o = t.getExtentMin(),
                            s = t.getExtentMax(),
                            l = r.getExtentMax(),
                            h = r.getExtentMin(),
                            u = this._axes[0].rootNode,
                            c = this._axes[1].rootNode,
                            d = this._axes[2].rootNode,
                            f = this._faces,
                            p = f[4].rootNode.invisible ? h : l,
                            m = f[2].rootNode.invisible ? n : a,
                            g = f[0].rootNode.invisible ? o : s,
                            _ = f[2].rootNode.invisible ? n : a,
                            v = f[0].rootNode.invisible ? s : o,
                            y = f[4].rootNode.invisible ? h : l;
                          u.rotation.identity(), c.rotation.identity(), d.rotation.identity(), f[4].rootNode.invisible && (this._axes[0].flipped = !0, u.rotation.rotateX(Math.PI)), f[0].rootNode.invisible && (this._axes[1].flipped = !0, c.rotation.rotateZ(Math.PI)), f[4].rootNode.invisible && (this._axes[2].flipped = !0, d.rotation.rotateY(Math.PI)), u.position.set(0, m, p), c.position.set(g, _, 0), d.position.set(v, 0, y), u.update(), c.update(), d.update(), this._updateAxisLabelAlign()
                        },
                        _updateAxisLabelAlign: function () {
                          var e = this._control.getCamera(),
                            t = [new Ka.Vector4, new Ka.Vector4],
                            r = new Ka.Vector4;
                          this.groupGL.getWorldPosition(r), r.w = 1, r.transformMat4(e.viewMatrix).transformMat4(e.projectionMatrix), r.x /= r.w, r.y /= r.w, this._axes.forEach((function (i) {
                            for (var n = i.axisLineCoords, a = (i.labelsMesh.geometry, 0); a < t.length; a++) t[a].setArray(n[a]), t[a].w = 1, t[a].transformMat4(i.rootNode.worldTransform).transformMat4(e.viewMatrix).transformMat4(e.projectionMatrix), t[a].x /= t[a].w, t[a].y /= t[a].w;
                            var o, s, l = t[1].x - t[0].x,
                              h = t[1].y - t[0].y,
                              u = (t[1].x + t[0].x) / 2,
                              c = (t[1].y + t[0].y) / 2;
                            Math.abs(h / l) < .5 ? (o = "center", s = c > r.y ? "bottom" : "top") : (s = "middle", o = u > r.x ? "left" : "right"), i.setSpriteAlign(o, s, this._api)
                          }), this)
                        },
                        _doShowAxisPointer: function () {
                          this._axisPointerLineMesh.invisible && (this._axisPointerLineMesh.invisible = !1, this._axisPointerLabelsMesh.invisible = !1, this._api.getZr().refresh())
                        },
                        _doHideAxisPointer: function () {
                          this._axisPointerLineMesh.invisible || (this._axisPointerLineMesh.invisible = !0, this._axisPointerLabelsMesh.invisible = !0, this._api.getZr().refresh())
                        },
                        _updateAxisPointer: function (e) {
                          var t = this._model.coordinateSystem,
                            r = t.dataToPoint(e),
                            i = this._axisPointerLineMesh.geometry,
                            n = this._model.getModel("axisPointer"),
                            a = this._api.getDevicePixelRatio();

                          function o(e) {
                            return Mn(e.model.get("axisPointer.show"), n.get("show"))
                          }

                          function s(e) {
                            var t = e.model.getModel("axisPointer", n).getModel("lineStyle"),
                              r = Ka.parseColor(t.get("color")),
                              i = ns(t.get("width"), 1),
                              a = ns(t.get("opacity"), 1);
                            return r[3] *= a, {
                              color: r,
                              lineWidth: i
                            }
                          }
                          i.convertToDynamicArray(!0);
                          for (var l = 0; l < this._faces.length; l++) {
                            var h = this._faces[l];
                            if (!h.rootNode.invisible) {
                              for (var u = h.faceInfo, c = u[3] < 0 ? t.getAxis(u[2]).getExtentMin() : t.getAxis(u[2]).getExtentMax(), d = as[u[2]], f = 0; f < 2; f++) {
                                var p = u[f],
                                  m = u[1 - f],
                                  g = t.getAxis(p),
                                  _ = t.getAxis(m);
                                if (o(g)) {
                                  var v = as[p],
                                    y = as[m];
                                  (w = [0, 0, 0])[v] = (b = [0, 0, 0])[v] = r[v], w[d] = b[d] = c, w[y] = _.getExtentMin(), b[y] = _.getExtentMax();
                                  var x = s(g);
                                  i.addLine(w, b, x.color, x.lineWidth * a)
                                }
                              }
                              if (o(t.getAxis(u[2]))) {
                                var b, w = r.slice();
                                (b = r.slice())[d] = c, x = s(t.getAxis(u[2])), i.addLine(w, b, x.color, x.lineWidth * a)
                              }
                            }
                          }
                          i.convertToTypedArray(), this._updateAxisPointerLabelsMesh(e), this._api.getZr().refresh()
                        },
                        _updateAxisPointerLabelsMesh: function (e) {
                          var t = this._model,
                            r = this._axisPointerLabelsMesh,
                            n = this._axisPointerLabelsSurface,
                            a = t.coordinateSystem,
                            o = t.getModel("axisPointer");
                          r.geometry.convertToDynamicArray(!0), n.clear();
                          var s = {
                            x: "y",
                            y: "x",
                            z: "y"
                          };
                          this._axes.forEach((function (t, l) {
                            var h = a.getAxis(t.dim),
                              u = h.model.getModel("axisPointer", o),
                              c = u.getModel("label"),
                              d = u.get("lineStyle.color");
                            if (c.get("show") && u.get("show")) {
                              var f = e[l],
                                p = c.get("formatter"),
                                m = h.scale.getLabel({
                                  value: f
                                });
                              if (null != p) m = p(m, e);
                              else if ("interval" === h.scale.type || "log" === h.scale.type) {
                                var g = i.number.getPrecisionSafe(h.scale.getTicks()[0]);
                                m = f.toFixed(g + 2)
                              }
                              var _ = c.get("color"),
                                v = new i.graphic.Text({
                                  style: xo(c, {
                                    text: m,
                                    fill: _ || d,
                                    align: "left",
                                    verticalAlign: "top"
                                  })
                                }),
                                y = n.add(v),
                                x = v.getBoundingRect(),
                                b = this._api.getDevicePixelRatio(),
                                w = t.rootNode.position.toArray();
                              w[as[s[t.dim]]] += (t.flipped ? -1 : 1) * c.get("margin"), w[as[t.dim]] = h.dataToCoord(e[l]), r.geometry.addSprite(w, [x.width * b, x.height * b], y, t.textAlign, t.textVerticalAlign)
                            }
                          }), this), n.getZr().refreshImmediately(), r.material.set("uvScale", n.getCoordsScale()), r.geometry.convertToTypedArray()
                        },
                        dispose: function () {
                          this.groupGL.removeAll(), this._control.dispose(), this._axisLabelSurface.dispose(), this._axisPointerLabelsSurface.dispose()
                        }
                      }),
                      ss = function () {
                        function e(e) {
                          this.type = "cartesian", this._dimList = [], this._axes = {}, this.name = e || ""
                        }
                        return e.prototype.getAxis = function (e) {
                          return this._axes[e]
                        }, e.prototype.getAxes = function () {
                          return xa(this._dimList, (function (e) {
                            return this._axes[e]
                          }), this)
                        }, e.prototype.getAxesByScale = function (e) {
                          return e = e.toLowerCase(),
                            function (e, t, r) {
                              if (!e) return [];
                              if (!t) return Sa(e);
                              if (e.filter && e.filter === ca) return e.filter(t, r);
                              for (var i = [], n = 0, a = e.length; n < a; n++) t.call(r, e[n], n, e) && i.push(e[n]);
                              return i
                            }(this.getAxes(), (function (t) {
                              return t.scale.type === e
                            }))
                        }, e.prototype.addAxis = function (e) {
                          var t = e.dim;
                          this._axes[t] = e, this._dimList.push(t)
                        }, e
                      }();

                    function ls(e) {
                      ss.call(this, e), this.type = "cartesian3D", this.dimensions = ["x", "y", "z"], this.size = [0, 0, 0]
                    }
                    ls.prototype = {
                      constructor: ls,
                      model: null,
                      containPoint: function (e) {
                        return this.getAxis("x").contain(e[0]) && this.getAxis("y").contain(e[2]) && this.getAxis("z").contain(e[1])
                      },
                      containData: function (e) {
                        return this.getAxis("x").containData(e[0]) && this.getAxis("y").containData(e[1]) && this.getAxis("z").containData(e[2])
                      },
                      dataToPoint: function (e, t, r) {
                        return (t = t || [])[0] = this.getAxis("x").dataToCoord(e[0], r), t[2] = this.getAxis("y").dataToCoord(e[1], r), t[1] = this.getAxis("z").dataToCoord(e[2], r), t
                      },
                      pointToData: function (e, t, r) {
                        return (t = t || [])[0] = this.getAxis("x").coordToData(e[0], r), t[1] = this.getAxis("y").coordToData(e[2], r), t[2] = this.getAxis("z").coordToData(e[1], r), t
                      }
                    }, i.util.inherits(ls, ss);
                    const hs = ls;

                    function us(e, t, r) {
                      i.Axis.call(this, e, t, r)
                    }
                    us.prototype = {
                      constructor: us,
                      getExtentMin: function () {
                        var e = this._extent;
                        return Math.min(e[0], e[1])
                      },
                      getExtentMax: function () {
                        var e = this._extent;
                        return Math.max(e[0], e[1])
                      },
                      calculateCategoryInterval: function () {
                        return Math.floor(this.scale.count() / 8)
                      }
                    }, i.util.inherits(us, i.Axis);
                    const cs = us;

                    function ds(e, t, r) {
                      return e[0] = t[0], e[1] = t[1], e[2] = t[2], e[3] = t[3], e[4] = t[4] + r[0], e[5] = t[5] + r[1], e
                    }
                    const fs = function () {
                      function e(e, t) {
                        this.x = e || 0, this.y = t || 0
                      }
                      return e.prototype.copy = function (e) {
                        return this.x = e.x, this.y = e.y, this
                      }, e.prototype.clone = function () {
                        return new e(this.x, this.y)
                      }, e.prototype.set = function (e, t) {
                        return this.x = e, this.y = t, this
                      }, e.prototype.equal = function (e) {
                        return e.x === this.x && e.y === this.y
                      }, e.prototype.add = function (e) {
                        return this.x += e.x, this.y += e.y, this
                      }, e.prototype.scale = function (e) {
                        this.x *= e, this.y *= e
                      }, e.prototype.scaleAndAdd = function (e, t) {
                        this.x += e.x * t, this.y += e.y * t
                      }, e.prototype.sub = function (e) {
                        return this.x -= e.x, this.y -= e.y, this
                      }, e.prototype.dot = function (e) {
                        return this.x * e.x + this.y * e.y
                      }, e.prototype.len = function () {
                        return Math.sqrt(this.x * this.x + this.y * this.y)
                      }, e.prototype.lenSquare = function () {
                        return this.x * this.x + this.y * this.y
                      }, e.prototype.normalize = function () {
                        var e = this.len();
                        return this.x /= e, this.y /= e, this
                      }, e.prototype.distance = function (e) {
                        var t = this.x - e.x,
                          r = this.y - e.y;
                        return Math.sqrt(t * t + r * r)
                      }, e.prototype.distanceSquare = function (e) {
                        var t = this.x - e.x,
                          r = this.y - e.y;
                        return t * t + r * r
                      }, e.prototype.negate = function () {
                        return this.x = -this.x, this.y = -this.y, this
                      }, e.prototype.transform = function (e) {
                        if (e) {
                          var t = this.x,
                            r = this.y;
                          return this.x = e[0] * t + e[2] * r + e[4], this.y = e[1] * t + e[3] * r + e[5], this
                        }
                      }, e.prototype.toArray = function (e) {
                        return e[0] = this.x, e[1] = this.y, e
                      }, e.prototype.fromArray = function (e) {
                        this.x = e[0], this.y = e[1]
                      }, e.set = function (e, t, r) {
                        e.x = t, e.y = r
                      }, e.copy = function (e, t) {
                        e.x = t.x, e.y = t.y
                      }, e.len = function (e) {
                        return Math.sqrt(e.x * e.x + e.y * e.y)
                      }, e.lenSquare = function (e) {
                        return e.x * e.x + e.y * e.y
                      }, e.dot = function (e, t) {
                        return e.x * t.x + e.y * t.y
                      }, e.add = function (e, t, r) {
                        e.x = t.x + r.x, e.y = t.y + r.y
                      }, e.sub = function (e, t, r) {
                        e.x = t.x - r.x, e.y = t.y - r.y
                      }, e.scale = function (e, t, r) {
                        e.x = t.x * r, e.y = t.y * r
                      }, e.scaleAndAdd = function (e, t, r, i) {
                        e.x = t.x + r.x * i, e.y = t.y + r.y * i
                      }, e.lerp = function (e, t, r, i) {
                        var n = 1 - i;
                        e.x = n * t.x + i * r.x, e.y = n * t.y + i * r.y
                      }, e
                    }();
                    var ps = Math.min,
                      ms = Math.max,
                      gs = new fs,
                      _s = new fs,
                      vs = new fs,
                      ys = new fs,
                      xs = new fs,
                      bs = new fs;
                    const ws = function () {
                      function e(e, t, r, i) {
                        r < 0 && (e += r, r = -r), i < 0 && (t += i, i = -i), this.x = e, this.y = t, this.width = r, this.height = i
                      }
                      return e.prototype.union = function (e) {
                        var t = ps(e.x, this.x),
                          r = ps(e.y, this.y);
                        isFinite(this.x) && isFinite(this.width) ? this.width = ms(e.x + e.width, this.x + this.width) - t : this.width = e.width, isFinite(this.y) && isFinite(this.height) ? this.height = ms(e.y + e.height, this.y + this.height) - r : this.height = e.height, this.x = t, this.y = r
                      }, e.prototype.applyTransform = function (t) {
                        e.applyTransform(this, this, t)
                      }, e.prototype.calculateTransform = function (e) {
                        var t = this,
                          r = e.width / t.width,
                          i = e.height / t.height,
                          n = [1, 0, 0, 1, 0, 0];
                        return ds(n, n, [-t.x, -t.y]),
                          function (e, t, r) {
                            var i = r[0],
                              n = r[1];
                            e[0] = t[0] * i, e[1] = t[1] * n, e[2] = t[2] * i, e[3] = t[3] * n, e[4] = t[4] * i, e[5] = t[5] * n
                          }(n, n, [r, i]), ds(n, n, [e.x, e.y]), n
                      }, e.prototype.intersect = function (t, r) {
                        if (!t) return !1;
                        t instanceof e || (t = e.create(t));
                        var i = this,
                          n = i.x,
                          a = i.x + i.width,
                          o = i.y,
                          s = i.y + i.height,
                          l = t.x,
                          h = t.x + t.width,
                          u = t.y,
                          c = t.y + t.height,
                          d = !(a < l || h < n || s < u || c < o);
                        if (r) {
                          var f = 1 / 0,
                            p = 0,
                            m = Math.abs(a - l),
                            g = Math.abs(h - n),
                            _ = Math.abs(s - u),
                            v = Math.abs(c - o),
                            y = Math.min(m, g),
                            x = Math.min(_, v);
                          a < l || h < n ? y > p && (p = y, m < g ? fs.set(bs, -m, 0) : fs.set(bs, g, 0)) : y < f && (f = y, m < g ? fs.set(xs, m, 0) : fs.set(xs, -g, 0)), s < u || c < o ? x > p && (p = x, _ < v ? fs.set(bs, 0, -_) : fs.set(bs, 0, v)) : y < f && (f = y, _ < v ? fs.set(xs, 0, _) : fs.set(xs, 0, -v))
                        }
                        return r && fs.copy(r, d ? xs : bs), d
                      }, e.prototype.contain = function (e, t) {
                        var r = this;
                        return e >= r.x && e <= r.x + r.width && t >= r.y && t <= r.y + r.height
                      }, e.prototype.clone = function () {
                        return new e(this.x, this.y, this.width, this.height)
                      }, e.prototype.copy = function (t) {
                        e.copy(this, t)
                      }, e.prototype.plain = function () {
                        return {
                          x: this.x,
                          y: this.y,
                          width: this.width,
                          height: this.height
                        }
                      }, e.prototype.isFinite = function () {
                        return isFinite(this.x) && isFinite(this.y) && isFinite(this.width) && isFinite(this.height)
                      }, e.prototype.isZero = function () {
                        return 0 === this.width || 0 === this.height
                      }, e.create = function (t) {
                        return new e(t.x, t.y, t.width, t.height)
                      }, e.copy = function (e, t) {
                        e.x = t.x, e.y = t.y, e.width = t.width, e.height = t.height
                      }, e.applyTransform = function (t, r, i) {
                        if (i) {
                          if (i[1] < 1e-5 && i[1] > -1e-5 && i[2] < 1e-5 && i[2] > -1e-5) {
                            var n = i[0],
                              a = i[3],
                              o = i[4],
                              s = i[5];
                            return t.x = r.x * n + o, t.y = r.y * a + s, t.width = r.width * n, t.height = r.height * a, t.width < 0 && (t.x += t.width, t.width = -t.width), void(t.height < 0 && (t.y += t.height, t.height = -t.height))
                          }
                          gs.x = vs.x = r.x, gs.y = ys.y = r.y, _s.x = ys.x = r.x + r.width, _s.y = vs.y = r.y + r.height, gs.transform(i), ys.transform(i), _s.transform(i), vs.transform(i), t.x = ps(gs.x, _s.x, vs.x, ys.x), t.y = ps(gs.y, _s.y, vs.y, ys.y);
                          var l = ms(gs.x, _s.x, vs.x, ys.x),
                            h = ms(gs.y, _s.y, vs.y, ys.y);
                          t.width = l - t.x, t.height = h - t.y
                        } else t !== r && e.copy(t, r)
                      }, e
                    }();

                    function Ts(e, t, r, i, n) {
                      var a = 0,
                        o = 0;
                      null == i && (i = 1 / 0), null == n && (n = 1 / 0);
                      var s = 0;
                      t.eachChild((function (l, h) {
                        var u, c, d = l.getBoundingRect(),
                          f = t.childAt(h + 1),
                          p = f && f.getBoundingRect();
                        if ("horizontal" === e) {
                          var m = d.width + (p ? -p.x + d.x : 0);
                          (u = a + m) > i || l.newline ? (a = 0, u = m, o += s + r, s = d.height) : s = Math.max(s, d.height)
                        } else {
                          var g = d.height + (p ? -p.y + d.y : 0);
                          (c = o + g) > n || l.newline ? (a += s + r, o = 0, c = g, s = d.width) : s = Math.max(s, d.width)
                        }
                        l.newline || (l.x = a, l.y = o, l.markRedraw(), "horizontal" === e ? a = u + r : o = c + r)
                      }))
                    }

                    function Ss(e, t, r) {
                      r = function (e) {
                        if ("number" == typeof e) return [e, e, e, e];
                        var t = e.length;
                        return 2 === t ? [e[0], e[1], e[0], e[1]] : 3 === t ? [e[0], e[1], e[2], e[1]] : e
                      }(r || 0);
                      var i = t.width,
                        n = t.height,
                        a = go(e.left, i),
                        o = go(e.top, n),
                        s = go(e.right, i),
                        l = go(e.bottom, n),
                        h = go(e.width, i),
                        u = go(e.height, n),
                        c = r[2] + r[0],
                        d = r[1] + r[3],
                        f = e.aspect;
                      switch (isNaN(h) && (h = i - s - d - a), isNaN(u) && (u = n - l - c - o), null != f && (isNaN(h) && isNaN(u) && (f > i / n ? h = .8 * i : u = .8 * n), isNaN(h) && (h = f * u), isNaN(u) && (u = h / f)), isNaN(a) && (a = i - s - h - d), isNaN(o) && (o = n - l - u - c), e.left || e.right) {
                        case "center":
                          a = i / 2 - h / 2 - r[3];
                          break;
                        case "right":
                          a = i - h - d
                      }
                      switch (e.top || e.bottom) {
                        case "middle":
                        case "center":
                          o = n / 2 - u / 2 - r[0];
                          break;
                        case "bottom":
                          o = n - u - c
                      }
                      a = a || 0, o = o || 0, isNaN(h) && (h = i - d - a - (s || 0)), isNaN(u) && (u = n - c - o - (l || 0));
                      var p = new ws(a + r[3], o + r[0], h, u);
                      return p.margin = r, p
                    }
                    wa(Ts, "vertical"), wa(Ts, "horizontal");
                    var Ms = function () {
                      this._pool = {}, this._allocatedTextures = []
                    };
                    Ms.prototype = {
                      constructor: Ms,
                      get: function (e) {
                        var t = Cs(e);
                        this._pool.hasOwnProperty(t) || (this._pool[t] = []);
                        var r = this._pool[t];
                        if (!r.length) {
                          var i = new Dr(e);
                          return this._allocatedTextures.push(i), i
                        }
                        return r.pop()
                      },
                      put: function (e) {
                        var t = Cs(e);
                        this._pool.hasOwnProperty(t) || (this._pool[t] = []), this._pool[t].push(e)
                      },
                      clear: function (e) {
                        for (var t = 0; t < this._allocatedTextures.length; t++) this._allocatedTextures[t].dispose(e);
                        this._pool = {}, this._allocatedTextures = []
                      }
                    };
                    var As = {
                        width: 512,
                        height: 512,
                        type: T,
                        format: A,
                        wrapS: I,
                        wrapT: I,
                        minFilter: O,
                        magFilter: C,
                        useMipmap: !0,
                        anisotropic: 1,
                        flipY: !0,
                        unpackAlignment: 4,
                        premultiplyAlpha: !1
                      },
                      Es = Object.keys(As);

                    function Cs(e) {
                      var t, r, i, n;
                      f.defaultsWithPropList(e, As, Es), r = (t = e).width, i = t.height, n = 0 == (r & r - 1) && 0 == (i & i - 1), t.format === M && (t.useMipmap = !1), n && t.useMipmap || (t.minFilter == D || t.minFilter == P ? t.minFilter = E : t.minFilter != O && t.minFilter != L || (t.minFilter = C)), n || (t.wrapS = I, t.wrapT = I);
                      for (var a = "", o = 0; o < Es.length; o++) a += e[Es[o]].toString();
                      return a
                    }
                    const Ds = Ms;
                    var Ls = ["px", "nx", "py", "ny", "pz", "nz"];

                    function Ps(e, t, r) {
                      return "alphaMap" === r ? e.material.get("diffuseMap") : "alphaCutoff" === r ? e.material.isDefined("fragment", "ALPHA_TEST") && e.material.get("diffuseMap") && e.material.get("alphaCutoff") || 0 : "uvRepeat" === r ? e.material.get("uvRepeat") : "uvOffset" === r ? e.material.get("uvOffset") : t.get(r)
                    }

                    function Os(e, t) {
                      var r = e.material,
                        i = t.material;
                      return r.get("diffuseMap") !== i.get("diffuseMap") || (r.get("alphaCutoff") || 0) !== (i.get("alphaCutoff") || 0)
                    }
                    Xe.import("@export clay.sm.depth.vertex\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\nattribute vec3 position : POSITION;\nattribute vec2 texcoord : TEXCOORD_0;\nuniform vec2 uvRepeat = vec2(1.0, 1.0);\nuniform vec2 uvOffset = vec2(0.0, 0.0);\n@import clay.chunk.skinning_header\n@import clay.chunk.instancing_header\nvarying vec4 v_ViewPosition;\nvarying vec2 v_Texcoord;\nvoid main(){\n vec4 P = vec4(position, 1.0);\n#ifdef SKINNING\n @import clay.chunk.skin_matrix\n P = skinMatrixWS * P;\n#endif\n#ifdef INSTANCING\n @import clay.chunk.instancing_matrix\n P = instanceMat * P;\n#endif\n v_ViewPosition = worldViewProjection * P;\n gl_Position = v_ViewPosition;\n v_Texcoord = texcoord * uvRepeat + uvOffset;\n}\n@end\n@export clay.sm.depth.fragment\nvarying vec4 v_ViewPosition;\nvarying vec2 v_Texcoord;\nuniform float bias : 0.001;\nuniform float slopeScale : 1.0;\nuniform sampler2D alphaMap;\nuniform float alphaCutoff: 0.0;\n@import clay.util.encode_float\nvoid main(){\n float depth = v_ViewPosition.z / v_ViewPosition.w;\n if (alphaCutoff > 0.0) {\n if (texture2D(alphaMap, v_Texcoord).a <= alphaCutoff) {\n discard;\n }\n }\n#ifdef USE_VSM\n depth = depth * 0.5 + 0.5;\n float moment1 = depth;\n float moment2 = depth * depth;\n #ifdef SUPPORT_STANDARD_DERIVATIVES\n float dx = dFdx(depth);\n float dy = dFdy(depth);\n moment2 += 0.25*(dx*dx+dy*dy);\n #endif\n gl_FragColor = vec4(moment1, moment2, 0.0, 1.0);\n#else\n #ifdef SUPPORT_STANDARD_DERIVATIVES\n float dx = dFdx(depth);\n float dy = dFdy(depth);\n depth += sqrt(dx*dx + dy*dy) * slopeScale + bias;\n #else\n depth += bias;\n #endif\n gl_FragColor = encodeFloat(depth * 0.5 + 0.5);\n#endif\n}\n@end\n@export clay.sm.debug_depth\nuniform sampler2D depthMap;\nvarying vec2 v_Texcoord;\n@import clay.util.decode_float\nvoid main() {\n vec4 tex = texture2D(depthMap, v_Texcoord);\n#ifdef USE_VSM\n gl_FragColor = vec4(tex.rgb, 1.0);\n#else\n float depth = decodeFloat(tex);\n gl_FragColor = vec4(depth, depth, depth, 1.0);\n#endif\n}\n@end\n@export clay.sm.distance.vertex\nuniform mat4 worldViewProjection : WORLDVIEWPROJECTION;\nuniform mat4 world : WORLD;\nattribute vec3 position : POSITION;\n@import clay.chunk.skinning_header\nvarying vec3 v_WorldPosition;\nvoid main (){\n vec4 P = vec4(position, 1.0);\n#ifdef SKINNING\n @import clay.chunk.skin_matrix\n P = skinMatrixWS * P;\n#endif\n#ifdef INSTANCING\n @import clay.chunk.instancing_matrix\n P = instanceMat * P;\n#endif\n gl_Position = worldViewProjection * P;\n v_WorldPosition = (world * P).xyz;\n}\n@end\n@export clay.sm.distance.fragment\nuniform vec3 lightPosition;\nuniform float range : 100;\nvarying vec3 v_WorldPosition;\n@import clay.util.encode_float\nvoid main(){\n float dist = distance(lightPosition, v_WorldPosition);\n#ifdef USE_VSM\n gl_FragColor = vec4(dist, dist * dist, 0.0, 0.0);\n#else\n dist = dist / range;\n gl_FragColor = encodeFloat(dist);\n#endif\n}\n@end\n@export clay.plugin.shadow_map_common\n@import clay.util.decode_float\nfloat tapShadowMap(sampler2D map, vec2 uv, float z){\n vec4 tex = texture2D(map, uv);\n return step(z, decodeFloat(tex) * 2.0 - 1.0);\n}\nfloat pcf(sampler2D map, vec2 uv, float z, float textureSize, vec2 scale) {\n float shadowContrib = tapShadowMap(map, uv, z);\n vec2 offset = vec2(1.0 / textureSize) * scale;\n#ifdef PCF_KERNEL_SIZE\n for (int _idx_ = 0; _idx_ < PCF_KERNEL_SIZE; _idx_++) {{\n shadowContrib += tapShadowMap(map, uv + offset * pcfKernel[_idx_], z);\n }}\n return shadowContrib / float(PCF_KERNEL_SIZE + 1);\n#else\n shadowContrib += tapShadowMap(map, uv+vec2(offset.x, 0.0), z);\n shadowContrib += tapShadowMap(map, uv+vec2(offset.x, offset.y), z);\n shadowContrib += tapShadowMap(map, uv+vec2(-offset.x, offset.y), z);\n shadowContrib += tapShadowMap(map, uv+vec2(0.0, offset.y), z);\n shadowContrib += tapShadowMap(map, uv+vec2(-offset.x, 0.0), z);\n shadowContrib += tapShadowMap(map, uv+vec2(-offset.x, -offset.y), z);\n shadowContrib += tapShadowMap(map, uv+vec2(offset.x, -offset.y), z);\n shadowContrib += tapShadowMap(map, uv+vec2(0.0, -offset.y), z);\n return shadowContrib / 9.0;\n#endif\n}\nfloat pcf(sampler2D map, vec2 uv, float z, float textureSize) {\n return pcf(map, uv, z, textureSize, vec2(1.0));\n}\nfloat chebyshevUpperBound(vec2 moments, float z){\n float p = 0.0;\n z = z * 0.5 + 0.5;\n if (z <= moments.x) {\n p = 1.0;\n }\n float variance = moments.y - moments.x * moments.x;\n variance = max(variance, 0.0000001);\n float mD = moments.x - z;\n float pMax = variance / (variance + mD * mD);\n pMax = clamp((pMax-0.4)/(1.0-0.4), 0.0, 1.0);\n return max(p, pMax);\n}\nfloat computeShadowContrib(\n sampler2D map, mat4 lightVPM, vec3 position, float textureSize, vec2 scale, vec2 offset\n) {\n vec4 posInLightSpace = lightVPM * vec4(position, 1.0);\n posInLightSpace.xyz /= posInLightSpace.w;\n float z = posInLightSpace.z;\n if(all(greaterThan(posInLightSpace.xyz, vec3(-0.99, -0.99, -1.0))) &&\n all(lessThan(posInLightSpace.xyz, vec3(0.99, 0.99, 1.0)))){\n vec2 uv = (posInLightSpace.xy+1.0) / 2.0;\n #ifdef USE_VSM\n vec2 moments = texture2D(map, uv * scale + offset).xy;\n return chebyshevUpperBound(moments, z);\n #else\n return pcf(map, uv * scale + offset, z, textureSize, scale);\n #endif\n }\n return 1.0;\n}\nfloat computeShadowContrib(sampler2D map, mat4 lightVPM, vec3 position, float textureSize) {\n return computeShadowContrib(map, lightVPM, position, textureSize, vec2(1.0), vec2(0.0));\n}\nfloat computeShadowContribOmni(samplerCube map, vec3 direction, float range)\n{\n float dist = length(direction);\n vec4 shadowTex = textureCube(map, direction);\n#ifdef USE_VSM\n vec2 moments = shadowTex.xy;\n float variance = moments.y - moments.x * moments.x;\n float mD = moments.x - dist;\n float p = variance / (variance + mD * mD);\n if(moments.x + 0.001 < dist){\n return clamp(p, 0.0, 1.0);\n }else{\n return 1.0;\n }\n#else\n return step(dist, (decodeFloat(shadowTex) + 0.0002) * range);\n#endif\n}\n@end\n@export clay.plugin.compute_shadow_map\n#if defined(SPOT_LIGHT_SHADOWMAP_COUNT) || defined(DIRECTIONAL_LIGHT_SHADOWMAP_COUNT) || defined(POINT_LIGHT_SHADOWMAP_COUNT)\n#ifdef SPOT_LIGHT_SHADOWMAP_COUNT\nuniform sampler2D spotLightShadowMaps[SPOT_LIGHT_SHADOWMAP_COUNT]:unconfigurable;\nuniform mat4 spotLightMatrices[SPOT_LIGHT_SHADOWMAP_COUNT]:unconfigurable;\nuniform float spotLightShadowMapSizes[SPOT_LIGHT_SHADOWMAP_COUNT]:unconfigurable;\n#endif\n#ifdef DIRECTIONAL_LIGHT_SHADOWMAP_COUNT\n#if defined(SHADOW_CASCADE)\nuniform sampler2D directionalLightShadowMaps[1]:unconfigurable;\nuniform mat4 directionalLightMatrices[SHADOW_CASCADE]:unconfigurable;\nuniform float directionalLightShadowMapSizes[1]:unconfigurable;\nuniform float shadowCascadeClipsNear[SHADOW_CASCADE]:unconfigurable;\nuniform float shadowCascadeClipsFar[SHADOW_CASCADE]:unconfigurable;\n#else\nuniform sampler2D directionalLightShadowMaps[DIRECTIONAL_LIGHT_SHADOWMAP_COUNT]:unconfigurable;\nuniform mat4 directionalLightMatrices[DIRECTIONAL_LIGHT_SHADOWMAP_COUNT]:unconfigurable;\nuniform float directionalLightShadowMapSizes[DIRECTIONAL_LIGHT_SHADOWMAP_COUNT]:unconfigurable;\n#endif\n#endif\n#ifdef POINT_LIGHT_SHADOWMAP_COUNT\nuniform samplerCube pointLightShadowMaps[POINT_LIGHT_SHADOWMAP_COUNT]:unconfigurable;\n#endif\nuniform bool shadowEnabled : true;\n#ifdef PCF_KERNEL_SIZE\nuniform vec2 pcfKernel[PCF_KERNEL_SIZE];\n#endif\n@import clay.plugin.shadow_map_common\n#if defined(SPOT_LIGHT_SHADOWMAP_COUNT)\nvoid computeShadowOfSpotLights(vec3 position, inout float shadowContribs[SPOT_LIGHT_COUNT] ) {\n float shadowContrib;\n for(int _idx_ = 0; _idx_ < SPOT_LIGHT_SHADOWMAP_COUNT; _idx_++) {{\n shadowContrib = computeShadowContrib(\n spotLightShadowMaps[_idx_], spotLightMatrices[_idx_], position,\n spotLightShadowMapSizes[_idx_]\n );\n shadowContribs[_idx_] = shadowContrib;\n }}\n for(int _idx_ = SPOT_LIGHT_SHADOWMAP_COUNT; _idx_ < SPOT_LIGHT_COUNT; _idx_++){{\n shadowContribs[_idx_] = 1.0;\n }}\n}\n#endif\n#if defined(DIRECTIONAL_LIGHT_SHADOWMAP_COUNT)\n#ifdef SHADOW_CASCADE\nvoid computeShadowOfDirectionalLights(vec3 position, inout float shadowContribs[DIRECTIONAL_LIGHT_COUNT]){\n float depth = (2.0 * gl_FragCoord.z - gl_DepthRange.near - gl_DepthRange.far)\n / (gl_DepthRange.far - gl_DepthRange.near);\n float shadowContrib;\n shadowContribs[0] = 1.0;\n for (int _idx_ = 0; _idx_ < SHADOW_CASCADE; _idx_++) {{\n if (\n depth >= shadowCascadeClipsNear[_idx_] &&\n depth <= shadowCascadeClipsFar[_idx_]\n ) {\n shadowContrib = computeShadowContrib(\n directionalLightShadowMaps[0], directionalLightMatrices[_idx_], position,\n directionalLightShadowMapSizes[0],\n vec2(1.0 / float(SHADOW_CASCADE), 1.0),\n vec2(float(_idx_) / float(SHADOW_CASCADE), 0.0)\n );\n shadowContribs[0] = shadowContrib;\n }\n }}\n for(int _idx_ = DIRECTIONAL_LIGHT_SHADOWMAP_COUNT; _idx_ < DIRECTIONAL_LIGHT_COUNT; _idx_++) {{\n shadowContribs[_idx_] = 1.0;\n }}\n}\n#else\nvoid computeShadowOfDirectionalLights(vec3 position, inout float shadowContribs[DIRECTIONAL_LIGHT_COUNT]){\n float shadowContrib;\n for(int _idx_ = 0; _idx_ < DIRECTIONAL_LIGHT_SHADOWMAP_COUNT; _idx_++) {{\n shadowContrib = computeShadowContrib(\n directionalLightShadowMaps[_idx_], directionalLightMatrices[_idx_], position,\n directionalLightShadowMapSizes[_idx_]\n );\n shadowContribs[_idx_] = shadowContrib;\n }}\n for(int _idx_ = DIRECTIONAL_LIGHT_SHADOWMAP_COUNT; _idx_ < DIRECTIONAL_LIGHT_COUNT; _idx_++) {{\n shadowContribs[_idx_] = 1.0;\n }}\n}\n#endif\n#endif\n#if defined(POINT_LIGHT_SHADOWMAP_COUNT)\nvoid computeShadowOfPointLights(vec3 position, inout float shadowContribs[POINT_LIGHT_COUNT] ){\n vec3 lightPosition;\n vec3 direction;\n for(int _idx_ = 0; _idx_ < POINT_LIGHT_SHADOWMAP_COUNT; _idx_++) {{\n lightPosition = pointLightPosition[_idx_];\n direction = position - lightPosition;\n shadowContribs[_idx_] = computeShadowContribOmni(pointLightShadowMaps[_idx_], direction, pointLightRange[_idx_]);\n }}\n for(int _idx_ = POINT_LIGHT_SHADOWMAP_COUNT; _idx_ < POINT_LIGHT_COUNT; _idx_++) {{\n shadowContribs[_idx_] = 1.0;\n }}\n}\n#endif\n#endif\n@end");
                    var Ns, Is, Rs, Bs, Fs, zs, Gs, Us = m.extend((function () {
                      return {
                        softShadow: Us.PCF,
                        shadowBlur: 1,
                        lightFrustumBias: "auto",
                        kernelPCF: new Float32Array([1, 0, 1, 1, -1, 1, 0, 1, -1, 0, -1, -1, 1, -1, 0, -1]),
                        precision: "highp",
                        _lastRenderNotCastShadow: !1,
                        _frameBuffer: new zi,
                        _textures: {},
                        _shadowMapNumber: {
                          POINT_LIGHT: 0,
                          DIRECTIONAL_LIGHT: 0,
                          SPOT_LIGHT: 0
                        },
                        _depthMaterials: {},
                        _distanceMaterials: {},
                        _receivers: [],
                        _lightsCastShadow: [],
                        _lightCameras: {},
                        _lightMaterials: {},
                        _texturePool: new Ds
                      }
                    }), (function () {
                      this._gaussianPassH = new pn({
                        fragment: Xe.source("clay.compositor.gaussian_blur")
                      }), this._gaussianPassV = new pn({
                        fragment: Xe.source("clay.compositor.gaussian_blur")
                      }), this._gaussianPassH.setUniform("blurSize", this.shadowBlur), this._gaussianPassH.setUniform("blurDir", 0), this._gaussianPassV.setUniform("blurSize", this.shadowBlur), this._gaussianPassV.setUniform("blurDir", 1), this._outputDepthPass = new pn({
                        fragment: Xe.source("clay.sm.debug_depth")
                      })
                    }), {
                      render: function (e, t, r, i) {
                        r || (r = t.getMainCamera()), this.trigger("beforerender", this, e, t, r), this._renderShadowPass(e, t, r, i), this.trigger("afterrender", this, e, t, r)
                      },
                      renderDebug: function (e, t) {
                        e.saveClear();
                        var r = e.viewport,
                          i = 0,
                          n = t || r.width / 4,
                          a = n;
                        for (var o in this.softShadow === Us.VSM ? this._outputDepthPass.material.define("fragment", "USE_VSM") : this._outputDepthPass.material.undefine("fragment", "USE_VSM"), this._textures) {
                          var s = this._textures[o];
                          e.setViewport(i, 0, n * s.width / s.height, a), this._outputDepthPass.setUniform("depthMap", s), this._outputDepthPass.render(e), i += n * s.width / s.height
                        }
                        e.setViewport(r), e.restoreClear()
                      },
                      _updateReceivers: function (e, t) {
                        if (t.receiveShadow ? (this._receivers.push(t), t.material.set("shadowEnabled", 1), t.material.set("pcfKernel", this.kernelPCF)) : t.material.set("shadowEnabled", 0), this.softShadow === Us.VSM) t.material.define("fragment", "USE_VSM"), t.material.undefine("fragment", "PCF_KERNEL_SIZE");
                        else {
                          t.material.undefine("fragment", "USE_VSM");
                          var r = this.kernelPCF;
                          r && r.length ? t.material.define("fragment", "PCF_KERNEL_SIZE", r.length / 2) : t.material.undefine("fragment", "PCF_KERNEL_SIZE")
                        }
                      },
                      _update: function (e, t) {
                        var r = this;
                        t.traverse((function (t) {
                          t.isRenderable() && r._updateReceivers(e, t)
                        }));
                        for (var i = 0; i < t.lights.length; i++) {
                          var n = t.lights[i];
                          n.castShadow && !n.invisible && this._lightsCastShadow.push(n)
                        }
                      },
                      _renderShadowPass: function (e, t, r, i) {
                        for (var n in this._shadowMapNumber) this._shadowMapNumber[n] = 0;
                        this._lightsCastShadow.length = 0, this._receivers.length = 0;
                        var a = e.gl;
                        if (i || t.update(), r && r.update(), t.updateLights(), this._update(e, t), this._lightsCastShadow.length || !this._lastRenderNotCastShadow) {
                          this._lastRenderNotCastShadow = 0 === this._lightsCastShadow, a.enable(a.DEPTH_TEST), a.depthMask(!0), a.disable(a.BLEND), a.clearColor(1, 1, 1, 1);
                          for (var o, s = [], l = [], h = [], u = [], c = [], d = [], f = 0; f < this._lightsCastShadow.length; f++) {
                            var p = this._lightsCastShadow[f];
                            if ("DIRECTIONAL_LIGHT" === p.type) {
                              if (o) {
                                console.warn("Only one direectional light supported with shadow cascade");
                                continue
                              }
                              if (p.shadowCascade > 4) {
                                console.warn("Support at most 4 cascade");
                                continue
                              }
                              p.shadowCascade > 1 && (o = p), this.renderDirectionalLightShadow(e, t, r, p, c, u, h)
                            } else "SPOT_LIGHT" === p.type ? this.renderSpotLightShadow(e, t, p, l, s) : "POINT_LIGHT" === p.type && this.renderPointLightShadow(e, t, p, d);
                            this._shadowMapNumber[p.type]++
                          }
                          for (var m in this._shadowMapNumber) {
                            var g = this._shadowMapNumber[m],
                              _ = m + "_SHADOWMAP_COUNT";
                            for (f = 0; f < this._receivers.length; f++)(v = this._receivers[f].material).fragmentDefines[_] !== g && (g > 0 ? v.define("fragment", _, g) : v.isDefined("fragment", _) && v.undefine("fragment", _))
                          }
                          for (f = 0; f < this._receivers.length; f++) {
                            var v = this._receivers[f].material;
                            o ? v.define("fragment", "SHADOW_CASCADE", o.shadowCascade) : v.undefine("fragment", "SHADOW_CASCADE")
                          }
                          var y = t.shadowUniforms;
                          if (h.length > 0) {
                            var x = h.map(S);
                            if (y.directionalLightShadowMaps = {
                                value: h,
                                type: "tv"
                              }, y.directionalLightMatrices = {
                                value: u,
                                type: "m4v"
                              }, y.directionalLightShadowMapSizes = {
                                value: x,
                                type: "1fv"
                              }, o) {
                              var b = c.slice(),
                                w = c.slice();
                              b.pop(), w.shift(), b.reverse(), w.reverse(), u.reverse(), y.shadowCascadeClipsNear = {
                                value: b,
                                type: "1fv"
                              }, y.shadowCascadeClipsFar = {
                                value: w,
                                type: "1fv"
                              }
                            }
                          }
                          if (s.length > 0) {
                            var T = s.map(S);
                            (y = t.shadowUniforms).spotLightShadowMaps = {
                              value: s,
                              type: "tv"
                            }, y.spotLightMatrices = {
                              value: l,
                              type: "m4v"
                            }, y.spotLightShadowMapSizes = {
                              value: T,
                              type: "1fv"
                            }
                          }
                          d.length > 0 && (y.pointLightShadowMaps = {
                            value: d,
                            type: "tv"
                          })
                        }

                        function S(e) {
                          return e.height
                        }
                      },
                      renderDirectionalLightShadow: (Ns = new si, Is = new Ht, Rs = new ir, Bs = new Ht, Fs = new Ht, zs = new Ht, Gs = new Ht, function (e, t, r, i, n, a, o) {
                        var s = this._getDepthMaterial(i),
                          l = {
                            getMaterial: function (e) {
                              return e.shadowDepthMaterial || s
                            },
                            isMaterialChanged: Os,
                            getUniform: Ps,
                            ifRender: function (e) {
                              return e.castShadow
                            },
                            sortCompare: ut.opaqueSortCompare
                          };
                        if (!t.viewBoundingBoxLastFrame.isFinite()) {
                          var h = t.getBoundingBox();
                          t.viewBoundingBoxLastFrame.copy(h).applyTransform(r.viewMatrix)
                        }
                        var u = Math.min(-t.viewBoundingBoxLastFrame.min.z, r.far),
                          c = Math.max(-t.viewBoundingBoxLastFrame.max.z, r.near),
                          d = this._getDirectionalLightCamera(i, t, r),
                          f = zs.array;
                        Gs.copy(d.projectionMatrix), Ye.invert(Fs.array, d.worldTransform.array), Ye.multiply(Fs.array, Fs.array, r.worldTransform.array), Ye.multiply(f, Gs.array, Fs.array);
                        for (var p = [], m = r instanceof Ei, g = (r.near + r.far) / (r.near - r.far), _ = 2 * r.near * r.far / (r.near - r.far), v = 0; v <= i.shadowCascade; v++) {
                          var y = c * Math.pow(u / c, v / i.shadowCascade),
                            x = c + (u - c) * v / i.shadowCascade,
                            b = y * i.cascadeSplitLogFactor + x * (1 - i.cascadeSplitLogFactor);
                          p.push(b), n.push(-(-b * g + _) / -b)
                        }
                        var w = this._getTexture(i, i.shadowCascade);
                        o.push(w);
                        var T = e.viewport,
                          S = e.gl;
                        for (this._frameBuffer.attach(w), this._frameBuffer.bind(e), S.clear(S.COLOR_BUFFER_BIT | S.DEPTH_BUFFER_BIT), v = 0; v < i.shadowCascade; v++) {
                          var M = p[v],
                            A = p[v + 1];
                          m ? Ye.perspective(Is.array, r.fov / 180 * Math.PI, r.aspect, M, A) : Ye.ortho(Is.array, r.left, r.right, r.bottom, r.top, M, A), Ns.setFromProjection(Is), Ns.getTransformedBoundingBox(Rs, Fs), Rs.applyProjection(Gs);
                          var E = Rs.min.array,
                            C = Rs.max.array;
                          E[0] = Math.max(E[0], -1), E[1] = Math.max(E[1], -1), C[0] = Math.min(C[0], 1), C[1] = Math.min(C[1], 1), Bs.ortho(E[0], C[0], E[1], C[1], 1, -1), d.projectionMatrix.multiplyLeft(Bs);
                          var D = i.shadowResolution || 512;
                          e.setViewport((i.shadowCascade - v - 1) * D, 0, D, D, 1);
                          var L = t.updateRenderList(d);
                          e.renderPass(L.opaque, d, l), this.softShadow === Us.VSM && this._gaussianFilter(e, w, w.width);
                          var P = new Ht;
                          P.copy(d.viewMatrix).multiplyLeft(d.projectionMatrix), a.push(P.array), d.projectionMatrix.copy(Gs)
                        }
                        this._frameBuffer.unbind(e), e.setViewport(T)
                      }),
                      renderSpotLightShadow: function (e, t, r, i, n) {
                        var a = this._getTexture(r),
                          o = this._getSpotLightCamera(r),
                          s = e.gl;
                        this._frameBuffer.attach(a), this._frameBuffer.bind(e), s.clear(s.COLOR_BUFFER_BIT | s.DEPTH_BUFFER_BIT);
                        var l = this._getDepthMaterial(r),
                          h = {
                            getMaterial: function (e) {
                              return e.shadowDepthMaterial || l
                            },
                            isMaterialChanged: Os,
                            getUniform: Ps,
                            ifRender: function (e) {
                              return e.castShadow
                            },
                            sortCompare: ut.opaqueSortCompare
                          },
                          u = t.updateRenderList(o);
                        e.renderPass(u.opaque, o, h), this._frameBuffer.unbind(e), this.softShadow === Us.VSM && this._gaussianFilter(e, a, a.width);
                        var c = new Ht;
                        c.copy(o.worldTransform).invert().multiplyLeft(o.projectionMatrix), n.push(a), i.push(c.array)
                      },
                      renderPointLightShadow: function (e, t, r, i) {
                        var n = this._getTexture(r),
                          a = e.gl;
                        i.push(n);
                        var o = this._getDepthMaterial(r),
                          s = {
                            getMaterial: function (e) {
                              return e.shadowDepthMaterial || o
                            },
                            getUniform: Ps,
                            sortCompare: ut.opaqueSortCompare
                          },
                          l = {
                            px: [],
                            py: [],
                            pz: [],
                            nx: [],
                            ny: [],
                            nz: []
                          },
                          h = new ir,
                          u = r.getWorldPosition().array,
                          c = new ir,
                          d = r.range;
                        c.min.setArray(u), c.max.setArray(u);
                        var f = new vt(d, d, d);
                        c.max.add(f), c.min.sub(f);
                        var p = {
                          px: !1,
                          py: !1,
                          pz: !1,
                          nx: !1,
                          ny: !1,
                          nz: !1
                        };
                        t.traverse((function (e) {
                          if (e.isRenderable() && e.castShadow) {
                            var t = e.geometry;
                            if (!t.boundingBox) {
                              for (var r = 0; r < Ls.length; r++) l[Ls[r]].push(e);
                              return
                            }
                            if (h.transformFrom(t.boundingBox, e.worldTransform), !h.intersectBoundingBox(c)) return;
                            for (h.updateVertices(), r = 0; r < Ls.length; r++) p[Ls[r]] = !1;
                            for (r = 0; r < 8; r++) {
                              var i = h.vertices[r],
                                n = i[0] - u[0],
                                a = i[1] - u[1],
                                o = i[2] - u[2],
                                s = Math.abs(n),
                                d = Math.abs(a),
                                f = Math.abs(o);
                              s > d ? s > f ? p[n > 0 ? "px" : "nx"] = !0 : p[o > 0 ? "pz" : "nz"] = !0 : d > f ? p[a > 0 ? "py" : "ny"] = !0 : p[o > 0 ? "pz" : "nz"] = !0
                            }
                            for (r = 0; r < Ls.length; r++) p[Ls[r]] && l[Ls[r]].push(e)
                          }
                        }));
                        for (var m = 0; m < 6; m++) {
                          var g = Ls[m],
                            _ = this._getPointLightCamera(r, g);
                          this._frameBuffer.attach(n, a.COLOR_ATTACHMENT0, a.TEXTURE_CUBE_MAP_POSITIVE_X + m), this._frameBuffer.bind(e), a.clear(a.COLOR_BUFFER_BIT | a.DEPTH_BUFFER_BIT), e.renderPass(l[g], _, s)
                        }
                        this._frameBuffer.unbind(e)
                      },
                      _getDepthMaterial: function (e) {
                        var t = this._lightMaterials[e.__uid__],
                          r = "POINT_LIGHT" === e.type;
                        if (!t) {
                          var i = r ? "clay.sm.distance." : "clay.sm.depth.";
                          t = new le({
                            precision: this.precision,
                            shader: new Xe(Xe.source(i + "vertex"), Xe.source(i + "fragment"))
                          }), this._lightMaterials[e.__uid__] = t
                        }
                        return null != e.shadowSlopeScale && t.setUniform("slopeScale", e.shadowSlopeScale), null != e.shadowBias && t.setUniform("bias", e.shadowBias), this.softShadow === Us.VSM ? t.define("fragment", "USE_VSM") : t.undefine("fragment", "USE_VSM"), r && (t.set("lightPosition", e.getWorldPosition().array), t.set("range", e.range)), t
                      },
                      _gaussianFilter: function (e, t, r) {
                        var i = {
                            width: r,
                            height: r,
                            type: wr.FLOAT
                          },
                          n = this._texturePool.get(i);
                        this._frameBuffer.attach(n), this._frameBuffer.bind(e), this._gaussianPassH.setUniform("texture", t), this._gaussianPassH.setUniform("textureWidth", r), this._gaussianPassH.render(e), this._frameBuffer.attach(t), this._gaussianPassV.setUniform("texture", n), this._gaussianPassV.setUniform("textureHeight", r), this._gaussianPassV.render(e), this._frameBuffer.unbind(e), this._texturePool.put(n)
                      },
                      _getTexture: function (e, t) {
                        var r = e.__uid__,
                          i = this._textures[r],
                          n = e.shadowResolution || 512;
                        return t = t || 1, i || ((i = "POINT_LIGHT" === e.type ? new Ai : new Dr).width = n * t, i.height = n, this.softShadow === Us.VSM ? (i.type = wr.FLOAT, i.anisotropic = 4) : (i.minFilter = E, i.magFilter = E, i.useMipmap = !1), this._textures[r] = i), i
                      },
                      _getPointLightCamera: function (e, t) {
                        this._lightCameras.point || (this._lightCameras.point = {
                          px: new Ei,
                          nx: new Ei,
                          py: new Ei,
                          ny: new Ei,
                          pz: new Ei,
                          nz: new Ei
                        });
                        var r = this._lightCameras.point[t];
                        switch (r.far = e.range, r.fov = 90, r.position.set(0, 0, 0), t) {
                          case "px":
                            r.lookAt(vt.POSITIVE_X, vt.NEGATIVE_Y);
                            break;
                          case "nx":
                            r.lookAt(vt.NEGATIVE_X, vt.NEGATIVE_Y);
                            break;
                          case "py":
                            r.lookAt(vt.POSITIVE_Y, vt.POSITIVE_Z);
                            break;
                          case "ny":
                            r.lookAt(vt.NEGATIVE_Y, vt.NEGATIVE_Z);
                            break;
                          case "pz":
                            r.lookAt(vt.POSITIVE_Z, vt.NEGATIVE_Y);
                            break;
                          case "nz":
                            r.lookAt(vt.NEGATIVE_Z, vt.NEGATIVE_Y)
                        }
                        return e.getWorldPosition(r.position), r.update(), r
                      },
                      _getDirectionalLightCamera: function () {
                        var e = new Ht,
                          t = new ir,
                          r = new ir;
                        return function (i, n, a) {
                          this._lightCameras.directional || (this._lightCameras.directional = new un);
                          var o = this._lightCameras.directional;
                          t.copy(n.viewBoundingBoxLastFrame), t.intersection(a.frustum.boundingBox), o.position.copy(t.min).add(t.max).scale(.5).transformMat4(a.worldTransform), o.rotation.copy(i.rotation), o.scale.copy(i.scale), o.updateWorldTransform(), Ht.invert(e, o.worldTransform), Ht.multiply(e, e, a.worldTransform), r.copy(t).applyTransform(e);
                          var s = r.min.array,
                            l = r.max.array;
                          return o.position.set((s[0] + l[0]) / 2, (s[1] + l[1]) / 2, l[2]).transformMat4(o.worldTransform), o.near = 0, o.far = -s[2] + l[2], isNaN(this.lightFrustumBias) ? o.far *= 4 : o.far += this.lightFrustumBias, o.left = s[0], o.right = l[0], o.top = l[1], o.bottom = s[1], o.update(!0), o
                        }
                      }(),
                      _getSpotLightCamera: function (e) {
                        this._lightCameras.spot || (this._lightCameras.spot = new Ei);
                        var t = this._lightCameras.spot;
                        return t.fov = 2 * e.penumbraAngle, t.far = e.range, t.worldTransform.copy(e.worldTransform), t.updateProjectionMatrix(), Ye.invert(t.viewMatrix.array, t.worldTransform.array), t
                      },
                      dispose: function (e) {
                        var t = e.gl || e;
                        for (var r in this._frameBuffer && this._frameBuffer.dispose(t), this._textures) this._textures[r].dispose(t);
                        this._texturePool.clear(e.gl), this._depthMaterials = {}, this._distanceMaterials = {}, this._textures = {}, this._lightCameras = {}, this._shadowMapNumber = {
                          POINT_LIGHT: 0,
                          DIRECTIONAL_LIGHT: 0,
                          SPOT_LIGHT: 0
                        }, this._meshMaterials = {};
                        for (var i = 0; i < this._receivers.length; i++) {
                          var n = this._receivers[i];
                          if (n.material) {
                            var a = n.material;
                            a.undefine("fragment", "POINT_LIGHT_SHADOW_COUNT"), a.undefine("fragment", "DIRECTIONAL_LIGHT_SHADOW_COUNT"), a.undefine("fragment", "AMBIENT_LIGHT_SHADOW_COUNT"), a.set("shadowEnabled", 0)
                          }
                        }
                        this._receivers = [], this._lightsCastShadow = []
                      }
                    });
                    Us.VSM = 1, Us.PCF = 2;
                    const ks = Us,
                      Vs = m.extend((function () {
                        return {
                          name: "",
                          inputLinks: {},
                          outputLinks: {},
                          _prevOutputTextures: {},
                          _outputTextures: {},
                          _outputReferences: {},
                          _rendering: !1,
                          _rendered: !1,
                          _compositor: null
                        }
                      }), {
                        updateParameter: function (e, t) {
                          var r, i, n = this.outputs[e],
                            a = n.parameters,
                            o = n._parametersCopy;
                          if (o || (o = n._parametersCopy = {}), a)
                            for (var s in a) "width" !== s && "height" !== s && (o[s] = a[s]);
                          return r = a.width instanceof Function ? a.width.call(this, t) : a.width, i = a.height instanceof Function ? a.height.call(this, t) : a.height, o.width === r && o.height === i || this._outputTextures[e] && this._outputTextures[e].dispose(t.gl), o.width = r, o.height = i, o
                        },
                        setParameter: function (e, t) {},
                        getParameter: function (e) {},
                        setParameters: function (e) {
                          for (var t in e) this.setParameter(t, e[t])
                        },
                        render: function () {},
                        getOutput: function (e, t) {
                          if (null == t) return t = e, this._outputTextures[t];
                          var r = this.outputs[t];
                          return r ? this._rendered ? r.outputLastFrame ? this._prevOutputTextures[t] : this._outputTextures[t] : this._rendering ? (this._prevOutputTextures[t] || (this._prevOutputTextures[t] = this._compositor.allocateTexture(r.parameters || {})), this._prevOutputTextures[t]) : (this.render(e), this._outputTextures[t]) : void 0
                        },
                        removeReference: function (e) {
                          this._outputReferences[e]--, 0 === this._outputReferences[e] && (this.outputs[e].keepLastFrame ? (this._prevOutputTextures[e] && this._compositor.releaseTexture(this._prevOutputTextures[e]), this._prevOutputTextures[e] = this._outputTextures[e]) : this._compositor.releaseTexture(this._outputTextures[e]))
                        },
                        link: function (e, t, r) {
                          this.inputLinks[e] = {
                            node: t,
                            pin: r
                          }, t.outputLinks[r] || (t.outputLinks[r] = []), t.outputLinks[r].push({
                            node: this,
                            pin: e
                          }), this.pass.material.enableTexture(e)
                        },
                        clear: function () {
                          this.inputLinks = {}, this.outputLinks = {}
                        },
                        updateReference: function (e) {
                          if (!this._rendering) {
                            for (var t in this._rendering = !0, this.inputLinks) {
                              var r = this.inputLinks[t];
                              r.node.updateReference(r.pin)
                            }
                            this._rendering = !1
                          }
                          e && this._outputReferences[e]++
                        },
                        beforeFrame: function () {
                          for (var e in this._rendered = !1, this.outputLinks) this._outputReferences[e] = 0
                        },
                        afterFrame: function () {
                          for (var e in this.outputLinks) this._outputReferences[e] > 0 && (this.outputs[e].keepLastFrame ? (this._prevOutputTextures[e] && this._compositor.releaseTexture(this._prevOutputTextures[e]), this._prevOutputTextures[e] = this._outputTextures[e]) : this._compositor.releaseTexture(this._outputTextures[e]))
                        }
                      }),
                      Hs = m.extend((function () {
                        return {
                          nodes: []
                        }
                      }), {
                        dirty: function () {
                          this._dirty = !0
                        },
                        addNode: function (e) {
                          this.nodes.indexOf(e) >= 0 || (this.nodes.push(e), this._dirty = !0)
                        },
                        removeNode: function (e) {
                          "string" == typeof e && (e = this.getNodeByName(e));
                          var t = this.nodes.indexOf(e);
                          t >= 0 && (this.nodes.splice(t, 1), this._dirty = !0)
                        },
                        getNodeByName: function (e) {
                          for (var t = 0; t < this.nodes.length; t++)
                            if (this.nodes[t].name === e) return this.nodes[t]
                        },
                        update: function () {
                          for (var e = 0; e < this.nodes.length; e++) this.nodes[e].clear();
                          for (e = 0; e < this.nodes.length; e++) {
                            var t = this.nodes[e];
                            if (t.inputs)
                              for (var r in t.inputs)
                                if (t.inputs[r])
                                  if (!t.pass || t.pass.material.isUniformEnabled(r)) {
                                    var i = t.inputs[r],
                                      n = this.findPin(i);
                                    n ? t.link(r, n.node, n.pin) : "string" == typeof i ? console.warn("Node " + i + " not exist") : console.warn("Pin of " + i.node + "." + i.pin + " not exist")
                                  } else console.warn("Pin " + t.name + "." + r + " not used.")
                          }
                        },
                        findPin: function (e) {
                          var t;
                          if (("string" == typeof e || e instanceof Vs) && (e = {
                              node: e
                            }), "string" == typeof e.node)
                            for (var r = 0; r < this.nodes.length; r++) {
                              var i = this.nodes[r];
                              i.name === e.node && (t = i)
                            } else t = e.node;
                          if (t) {
                            var n = e.pin;
                            if (n || t.outputs && (n = Object.keys(t.outputs)[0]), t.outputs[n]) return {
                              node: t,
                              pin: n
                            }
                          }
                        }
                      }),
                      Ws = Hs.extend((function () {
                        return {
                          _outputs: [],
                          _texturePool: new Ds,
                          _frameBuffer: new zi({
                            depthBuffer: !1
                          })
                        }
                      }), {
                        addNode: function (e) {
                          Hs.prototype.addNode.call(this, e), e._compositor = this
                        },
                        render: function (e, t) {
                          if (this._dirty) {
                            this.update(), this._dirty = !1, this._outputs.length = 0;
                            for (var r = 0; r < this.nodes.length; r++) this.nodes[r].outputs || this._outputs.push(this.nodes[r])
                          }
                          for (r = 0; r < this.nodes.length; r++) this.nodes[r].beforeFrame();
                          for (r = 0; r < this._outputs.length; r++) this._outputs[r].updateReference();
                          for (r = 0; r < this._outputs.length; r++) this._outputs[r].render(e, t);
                          for (r = 0; r < this.nodes.length; r++) this.nodes[r].afterFrame()
                        },
                        allocateTexture: function (e) {
                          return this._texturePool.get(e)
                        },
                        releaseTexture: function (e) {
                          this._texturePool.put(e)
                        },
                        getFrameBuffer: function () {
                          return this._frameBuffer
                        },
                        dispose: function (e) {
                          this._texturePool.clear(e)
                        }
                      }),
                      js = Vs.extend({
                        name: "scene",
                        scene: null,
                        camera: null,
                        autoUpdateScene: !0,
                        preZ: !1
                      }, (function () {
                        this.frameBuffer = new zi
                      }), {
                        render: function (e) {
                          this._rendering = !0;
                          var t, r = e.gl;
                          if (this.trigger("beforerender"), this.outputs) {
                            var i = this.frameBuffer;
                            for (var n in this.outputs) {
                              var a = this.updateParameter(n, e),
                                o = this.outputs[n],
                                s = this._compositor.allocateTexture(a);
                              this._outputTextures[n] = s, "string" == typeof (u = o.attachment || r.COLOR_ATTACHMENT0) && (u = r[u]), i.attach(s, u)
                            }
                            i.bind(e);
                            var l = e.getGLExtension("EXT_draw_buffers");
                            if (l) {
                              var h = [];
                              for (var u in this.outputs)(u = parseInt(u)) >= r.COLOR_ATTACHMENT0 && u <= r.COLOR_ATTACHMENT0 + 8 && h.push(u);
                              l.drawBuffersEXT(h)
                            }
                            e.saveClear(), e.clearBit = 16640, t = e.render(this.scene, this.camera, !this.autoUpdateScene, this.preZ), e.restoreClear(), i.unbind(e)
                          } else t = e.render(this.scene, this.camera, !this.autoUpdateScene, this.preZ);
                          this.trigger("afterrender", t), this._rendering = !1, this._rendered = !0
                        }
                      }),
                      Xs = Vs.extend((function () {
                        return {
                          texture: null,
                          outputs: {
                            color: {}
                          }
                        }
                      }), (function () {}), {
                        getOutput: function (e, t) {
                          return this.texture
                        },
                        beforeFrame: function () {},
                        afterFrame: function () {}
                      }),
                      qs = Vs.extend((function () {
                        return {
                          name: "",
                          inputs: {},
                          outputs: null,
                          shader: "",
                          inputLinks: {},
                          outputLinks: {},
                          pass: null,
                          _prevOutputTextures: {},
                          _outputTextures: {},
                          _outputReferences: {},
                          _rendering: !1,
                          _rendered: !1,
                          _compositor: null
                        }
                      }), (function () {
                        var e = new pn({
                          fragment: this.shader
                        });
                        this.pass = e
                      }), {
                        render: function (e, t) {
                          this.trigger("beforerender", e), this._rendering = !0;
                          var r = e.gl;
                          for (var i in this.inputLinks) {
                            var n = (c = this.inputLinks[i]).node.getOutput(e, c.pin);
                            this.pass.setUniform(i, n)
                          }
                          if (this.outputs) {
                            this.pass.outputs = {};
                            var a = {};
                            for (var o in this.outputs) {
                              var s = this.updateParameter(o, e);
                              isNaN(s.width) && this.updateParameter(o, e);
                              var l = this.outputs[o],
                                h = this._compositor.allocateTexture(s);
                              this._outputTextures[o] = h, "string" == typeof (u = l.attachment || r.COLOR_ATTACHMENT0) && (u = r[u]), a[u] = h
                            }
                            for (var u in this._compositor.getFrameBuffer().bind(e), a) this._compositor.getFrameBuffer().attach(a[u], u);
                            this.pass.render(e), this._compositor.getFrameBuffer().updateMipmap(e)
                          } else this.pass.outputs = null, this._compositor.getFrameBuffer().unbind(e), this.pass.render(e, t);
                          for (var i in this.inputLinks) {
                            var c;
                            (c = this.inputLinks[i]).node.removeReference(c.pin)
                          }
                          this._rendering = !1, this._rendered = !0, this.trigger("afterrender", e)
                        },
                        updateParameter: function (e, t) {
                          var r, i, n = this.outputs[e],
                            a = n.parameters,
                            o = n._parametersCopy;
                          if (o || (o = n._parametersCopy = {}), a)
                            for (var s in a) "width" !== s && "height" !== s && (o[s] = a[s]);
                          return r = "function" == typeof a.width ? a.width.call(this, t) : a.width, i = "function" == typeof a.height ? a.height.call(this, t) : a.height, r = Math.ceil(r), i = Math.ceil(i), o.width === r && o.height === i || this._outputTextures[e] && this._outputTextures[e].dispose(t), o.width = r, o.height = i, o
                        },
                        setParameter: function (e, t) {
                          this.pass.setUniform(e, t)
                        },
                        getParameter: function (e) {
                          return this.pass.getUniform(e)
                        },
                        setParameters: function (e) {
                          for (var t in e) this.setParameter(t, e[t])
                        },
                        define: function (e, t) {
                          this.pass.material.define("fragment", e, t)
                        },
                        undefine: function (e) {
                          this.pass.material.undefine("fragment", e)
                        },
                        removeReference: function (e) {
                          this._outputReferences[e]--, 0 === this._outputReferences[e] && (this.outputs[e].keepLastFrame ? (this._prevOutputTextures[e] && this._compositor.releaseTexture(this._prevOutputTextures[e]), this._prevOutputTextures[e] = this._outputTextures[e]) : this._compositor.releaseTexture(this._outputTextures[e]))
                        },
                        clear: function () {
                          Vs.prototype.clear.call(this), this.pass.material.disableTexturesAll()
                        }
                      }),
                      Zs = "@export clay.compositor.kernel.gaussian_9\nfloat gaussianKernel[9];\ngaussianKernel[0] = 0.07;\ngaussianKernel[1] = 0.09;\ngaussianKernel[2] = 0.12;\ngaussianKernel[3] = 0.14;\ngaussianKernel[4] = 0.16;\ngaussianKernel[5] = 0.14;\ngaussianKernel[6] = 0.12;\ngaussianKernel[7] = 0.09;\ngaussianKernel[8] = 0.07;\n@end\n@export clay.compositor.kernel.gaussian_13\nfloat gaussianKernel[13];\ngaussianKernel[0] = 0.02;\ngaussianKernel[1] = 0.03;\ngaussianKernel[2] = 0.06;\ngaussianKernel[3] = 0.08;\ngaussianKernel[4] = 0.11;\ngaussianKernel[5] = 0.13;\ngaussianKernel[6] = 0.14;\ngaussianKernel[7] = 0.13;\ngaussianKernel[8] = 0.11;\ngaussianKernel[9] = 0.08;\ngaussianKernel[10] = 0.06;\ngaussianKernel[11] = 0.03;\ngaussianKernel[12] = 0.02;\n@end\n@export clay.compositor.gaussian_blur\n#define SHADER_NAME gaussian_blur\nuniform sampler2D texture;varying vec2 v_Texcoord;\nuniform float blurSize : 2.0;\nuniform vec2 textureSize : [512.0, 512.0];\nuniform float blurDir : 0.0;\n@import clay.util.rgbm\n@import clay.util.clamp_sample\nvoid main (void)\n{\n @import clay.compositor.kernel.gaussian_9\n vec2 off = blurSize / textureSize;\n off *= vec2(1.0 - blurDir, blurDir);\n vec4 sum = vec4(0.0);\n float weightAll = 0.0;\n for (int i = 0; i < 9; i++) {\n float w = gaussianKernel[i];\n vec4 texel = decodeHDR(clampSample(texture, v_Texcoord + float(i - 4) * off));\n sum += texel * w;\n weightAll += w;\n }\n gl_FragColor = encodeHDR(sum / max(weightAll, 0.01));\n}\n@end\n",
                      Ys = "\n@export clay.compositor.lut\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\nuniform sampler2D lookup;\nvoid main()\n{\n vec4 tex = texture2D(texture, v_Texcoord);\n float blueColor = tex.b * 63.0;\n vec2 quad1;\n quad1.y = floor(floor(blueColor) / 8.0);\n quad1.x = floor(blueColor) - (quad1.y * 8.0);\n vec2 quad2;\n quad2.y = floor(ceil(blueColor) / 8.0);\n quad2.x = ceil(blueColor) - (quad2.y * 8.0);\n vec2 texPos1;\n texPos1.x = (quad1.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * tex.r);\n texPos1.y = (quad1.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * tex.g);\n vec2 texPos2;\n texPos2.x = (quad2.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * tex.r);\n texPos2.y = (quad2.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * tex.g);\n vec4 newColor1 = texture2D(lookup, texPos1);\n vec4 newColor2 = texture2D(lookup, texPos2);\n vec4 newColor = mix(newColor1, newColor2, fract(blueColor));\n gl_FragColor = vec4(newColor.rgb, tex.w);\n}\n@end",
                      Ks = "@export clay.compositor.output\n#define OUTPUT_ALPHA\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\n@import clay.util.rgbm\nvoid main()\n{\n vec4 tex = decodeHDR(texture2D(texture, v_Texcoord));\n gl_FragColor.rgb = tex.rgb;\n#ifdef OUTPUT_ALPHA\n gl_FragColor.a = tex.a;\n#else\n gl_FragColor.a = 1.0;\n#endif\n gl_FragColor = encodeHDR(gl_FragColor);\n#ifdef PREMULTIPLY_ALPHA\n gl_FragColor.rgb *= gl_FragColor.a;\n#endif\n}\n@end",
                      Qs = "@export clay.compositor.bright\nuniform sampler2D texture;\nuniform float threshold : 1;\nuniform float scale : 1.0;\nuniform vec2 textureSize: [512, 512];\nvarying vec2 v_Texcoord;\nconst vec3 lumWeight = vec3(0.2125, 0.7154, 0.0721);\n@import clay.util.rgbm\nvec4 median(vec4 a, vec4 b, vec4 c)\n{\n return a + b + c - min(min(a, b), c) - max(max(a, b), c);\n}\nvoid main()\n{\n vec4 texel = decodeHDR(texture2D(texture, v_Texcoord));\n#ifdef ANTI_FLICKER\n vec3 d = 1.0 / textureSize.xyx * vec3(1.0, 1.0, 0.0);\n vec4 s1 = decodeHDR(texture2D(texture, v_Texcoord - d.xz));\n vec4 s2 = decodeHDR(texture2D(texture, v_Texcoord + d.xz));\n vec4 s3 = decodeHDR(texture2D(texture, v_Texcoord - d.zy));\n vec4 s4 = decodeHDR(texture2D(texture, v_Texcoord + d.zy));\n texel = median(median(texel, s1, s2), s3, s4);\n#endif\n float lum = dot(texel.rgb , lumWeight);\n vec4 color;\n if (lum > threshold && texel.a > 0.0)\n {\n color = vec4(texel.rgb * scale, texel.a * scale);\n }\n else\n {\n color = vec4(0.0);\n }\n gl_FragColor = encodeHDR(color);\n}\n@end\n",
                      Js = "@export clay.compositor.downsample\nuniform sampler2D texture;\nuniform vec2 textureSize : [512, 512];\nvarying vec2 v_Texcoord;\n@import clay.util.rgbm\nfloat brightness(vec3 c)\n{\n return max(max(c.r, c.g), c.b);\n}\n@import clay.util.clamp_sample\nvoid main()\n{\n vec4 d = vec4(-1.0, -1.0, 1.0, 1.0) / textureSize.xyxy;\n#ifdef ANTI_FLICKER\n vec3 s1 = decodeHDR(clampSample(texture, v_Texcoord + d.xy)).rgb;\n vec3 s2 = decodeHDR(clampSample(texture, v_Texcoord + d.zy)).rgb;\n vec3 s3 = decodeHDR(clampSample(texture, v_Texcoord + d.xw)).rgb;\n vec3 s4 = decodeHDR(clampSample(texture, v_Texcoord + d.zw)).rgb;\n float s1w = 1.0 / (brightness(s1) + 1.0);\n float s2w = 1.0 / (brightness(s2) + 1.0);\n float s3w = 1.0 / (brightness(s3) + 1.0);\n float s4w = 1.0 / (brightness(s4) + 1.0);\n float oneDivideSum = 1.0 / (s1w + s2w + s3w + s4w);\n vec4 color = vec4(\n (s1 * s1w + s2 * s2w + s3 * s3w + s4 * s4w) * oneDivideSum,\n 1.0\n );\n#else\n vec4 color = decodeHDR(clampSample(texture, v_Texcoord + d.xy));\n color += decodeHDR(clampSample(texture, v_Texcoord + d.zy));\n color += decodeHDR(clampSample(texture, v_Texcoord + d.xw));\n color += decodeHDR(clampSample(texture, v_Texcoord + d.zw));\n color *= 0.25;\n#endif\n gl_FragColor = encodeHDR(color);\n}\n@end",
                      $s = "\n@export clay.compositor.upsample\n#define HIGH_QUALITY\nuniform sampler2D texture;\nuniform vec2 textureSize : [512, 512];\nuniform float sampleScale: 0.5;\nvarying vec2 v_Texcoord;\n@import clay.util.rgbm\n@import clay.util.clamp_sample\nvoid main()\n{\n#ifdef HIGH_QUALITY\n vec4 d = vec4(1.0, 1.0, -1.0, 0.0) / textureSize.xyxy * sampleScale;\n vec4 s;\n s = decodeHDR(clampSample(texture, v_Texcoord - d.xy));\n s += decodeHDR(clampSample(texture, v_Texcoord - d.wy)) * 2.0;\n s += decodeHDR(clampSample(texture, v_Texcoord - d.zy));\n s += decodeHDR(clampSample(texture, v_Texcoord + d.zw)) * 2.0;\n s += decodeHDR(clampSample(texture, v_Texcoord )) * 4.0;\n s += decodeHDR(clampSample(texture, v_Texcoord + d.xw)) * 2.0;\n s += decodeHDR(clampSample(texture, v_Texcoord + d.zy));\n s += decodeHDR(clampSample(texture, v_Texcoord + d.wy)) * 2.0;\n s += decodeHDR(clampSample(texture, v_Texcoord + d.xy));\n gl_FragColor = encodeHDR(s / 16.0);\n#else\n vec4 d = vec4(-1.0, -1.0, +1.0, +1.0) / textureSize.xyxy;\n vec4 s;\n s = decodeHDR(clampSample(texture, v_Texcoord + d.xy));\n s += decodeHDR(clampSample(texture, v_Texcoord + d.zy));\n s += decodeHDR(clampSample(texture, v_Texcoord + d.xw));\n s += decodeHDR(clampSample(texture, v_Texcoord + d.zw));\n gl_FragColor = encodeHDR(s / 4.0);\n#endif\n}\n@end",
                      el = "@export clay.compositor.hdr.composite\n#define TONEMAPPING\nuniform sampler2D texture;\n#ifdef BLOOM_ENABLED\nuniform sampler2D bloom;\n#endif\n#ifdef LENSFLARE_ENABLED\nuniform sampler2D lensflare;\nuniform sampler2D lensdirt;\n#endif\n#ifdef LUM_ENABLED\nuniform sampler2D lum;\n#endif\n#ifdef LUT_ENABLED\nuniform sampler2D lut;\n#endif\n#ifdef COLOR_CORRECTION\nuniform float brightness : 0.0;\nuniform float contrast : 1.0;\nuniform float saturation : 1.0;\n#endif\n#ifdef VIGNETTE\nuniform float vignetteDarkness: 1.0;\nuniform float vignetteOffset: 1.0;\n#endif\nuniform float exposure : 1.0;\nuniform float bloomIntensity : 0.25;\nuniform float lensflareIntensity : 1;\nvarying vec2 v_Texcoord;\n@import clay.util.srgb\nvec3 ACESToneMapping(vec3 color)\n{\n const float A = 2.51;\n const float B = 0.03;\n const float C = 2.43;\n const float D = 0.59;\n const float E = 0.14;\n return (color * (A * color + B)) / (color * (C * color + D) + E);\n}\nfloat eyeAdaption(float fLum)\n{\n return mix(0.2, fLum, 0.5);\n}\n#ifdef LUT_ENABLED\nvec3 lutTransform(vec3 color) {\n float blueColor = color.b * 63.0;\n vec2 quad1;\n quad1.y = floor(floor(blueColor) / 8.0);\n quad1.x = floor(blueColor) - (quad1.y * 8.0);\n vec2 quad2;\n quad2.y = floor(ceil(blueColor) / 8.0);\n quad2.x = ceil(blueColor) - (quad2.y * 8.0);\n vec2 texPos1;\n texPos1.x = (quad1.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * color.r);\n texPos1.y = (quad1.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * color.g);\n vec2 texPos2;\n texPos2.x = (quad2.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * color.r);\n texPos2.y = (quad2.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * color.g);\n vec4 newColor1 = texture2D(lut, texPos1);\n vec4 newColor2 = texture2D(lut, texPos2);\n vec4 newColor = mix(newColor1, newColor2, fract(blueColor));\n return newColor.rgb;\n}\n#endif\n@import clay.util.rgbm\nvoid main()\n{\n vec4 texel = vec4(0.0);\n vec4 originalTexel = vec4(0.0);\n#ifdef TEXTURE_ENABLED\n texel = decodeHDR(texture2D(texture, v_Texcoord));\n originalTexel = texel;\n#endif\n#ifdef BLOOM_ENABLED\n vec4 bloomTexel = decodeHDR(texture2D(bloom, v_Texcoord));\n texel.rgb += bloomTexel.rgb * bloomIntensity;\n texel.a += bloomTexel.a * bloomIntensity;\n#endif\n#ifdef LENSFLARE_ENABLED\n texel += decodeHDR(texture2D(lensflare, v_Texcoord)) * texture2D(lensdirt, v_Texcoord) * lensflareIntensity;\n#endif\n texel.a = min(texel.a, 1.0);\n#ifdef LUM_ENABLED\n float fLum = texture2D(lum, vec2(0.5, 0.5)).r;\n float adaptedLumDest = 3.0 / (max(0.1, 1.0 + 10.0*eyeAdaption(fLum)));\n float exposureBias = adaptedLumDest * exposure;\n#else\n float exposureBias = exposure;\n#endif\n#ifdef TONEMAPPING\n texel.rgb *= exposureBias;\n texel.rgb = ACESToneMapping(texel.rgb);\n#endif\n texel = linearTosRGB(texel);\n#ifdef LUT_ENABLED\n texel.rgb = lutTransform(clamp(texel.rgb,vec3(0.0),vec3(1.0)));\n#endif\n#ifdef COLOR_CORRECTION\n texel.rgb = clamp(texel.rgb + vec3(brightness), 0.0, 1.0);\n texel.rgb = clamp((texel.rgb - vec3(0.5))*contrast+vec3(0.5), 0.0, 1.0);\n float lum = dot(texel.rgb, vec3(0.2125, 0.7154, 0.0721));\n texel.rgb = mix(vec3(lum), texel.rgb, saturation);\n#endif\n#ifdef VIGNETTE\n vec2 uv = (v_Texcoord - vec2(0.5)) * vec2(vignetteOffset);\n texel.rgb = mix(texel.rgb, vec3(1.0 - vignetteDarkness), dot(uv, uv));\n#endif\n gl_FragColor = encodeHDR(texel);\n#ifdef DEBUG\n #if DEBUG == 1\n gl_FragColor = encodeHDR(decodeHDR(texture2D(texture, v_Texcoord)));\n #elif DEBUG == 2\n gl_FragColor = encodeHDR(decodeHDR(texture2D(bloom, v_Texcoord)) * bloomIntensity);\n #elif DEBUG == 3\n gl_FragColor = encodeHDR(decodeHDR(texture2D(lensflare, v_Texcoord) * lensflareIntensity));\n #endif\n#endif\n if (originalTexel.a <= 0.01 && gl_FragColor.a > 1e-5) {\n gl_FragColor.a = dot(gl_FragColor.rgb, vec3(0.2125, 0.7154, 0.0721));\n }\n#ifdef PREMULTIPLY_ALPHA\n gl_FragColor.rgb *= gl_FragColor.a;\n#endif\n}\n@end",
                      tl = "@export clay.compositor.blend\n#define SHADER_NAME blend\n#ifdef TEXTURE1_ENABLED\nuniform sampler2D texture1;\nuniform float weight1 : 1.0;\n#endif\n#ifdef TEXTURE2_ENABLED\nuniform sampler2D texture2;\nuniform float weight2 : 1.0;\n#endif\n#ifdef TEXTURE3_ENABLED\nuniform sampler2D texture3;\nuniform float weight3 : 1.0;\n#endif\n#ifdef TEXTURE4_ENABLED\nuniform sampler2D texture4;\nuniform float weight4 : 1.0;\n#endif\n#ifdef TEXTURE5_ENABLED\nuniform sampler2D texture5;\nuniform float weight5 : 1.0;\n#endif\n#ifdef TEXTURE6_ENABLED\nuniform sampler2D texture6;\nuniform float weight6 : 1.0;\n#endif\nvarying vec2 v_Texcoord;\n@import clay.util.rgbm\nvoid main()\n{\n vec4 tex = vec4(0.0);\n#ifdef TEXTURE1_ENABLED\n tex += decodeHDR(texture2D(texture1, v_Texcoord)) * weight1;\n#endif\n#ifdef TEXTURE2_ENABLED\n tex += decodeHDR(texture2D(texture2, v_Texcoord)) * weight2;\n#endif\n#ifdef TEXTURE3_ENABLED\n tex += decodeHDR(texture2D(texture3, v_Texcoord)) * weight3;\n#endif\n#ifdef TEXTURE4_ENABLED\n tex += decodeHDR(texture2D(texture4, v_Texcoord)) * weight4;\n#endif\n#ifdef TEXTURE5_ENABLED\n tex += decodeHDR(texture2D(texture5, v_Texcoord)) * weight5;\n#endif\n#ifdef TEXTURE6_ENABLED\n tex += decodeHDR(texture2D(texture6, v_Texcoord)) * weight6;\n#endif\n gl_FragColor = encodeHDR(tex);\n}\n@end",
                      rl = "@export clay.compositor.fxaa\nuniform sampler2D texture;\nuniform vec4 viewport : VIEWPORT;\nvarying vec2 v_Texcoord;\n#define FXAA_REDUCE_MIN (1.0/128.0)\n#define FXAA_REDUCE_MUL (1.0/8.0)\n#define FXAA_SPAN_MAX 8.0\n@import clay.util.rgbm\nvoid main()\n{\n vec2 resolution = 1.0 / viewport.zw;\n vec3 rgbNW = decodeHDR( texture2D( texture, ( gl_FragCoord.xy + vec2( -1.0, -1.0 ) ) * resolution ) ).xyz;\n vec3 rgbNE = decodeHDR( texture2D( texture, ( gl_FragCoord.xy + vec2( 1.0, -1.0 ) ) * resolution ) ).xyz;\n vec3 rgbSW = decodeHDR( texture2D( texture, ( gl_FragCoord.xy + vec2( -1.0, 1.0 ) ) * resolution ) ).xyz;\n vec3 rgbSE = decodeHDR( texture2D( texture, ( gl_FragCoord.xy + vec2( 1.0, 1.0 ) ) * resolution ) ).xyz;\n vec4 rgbaM = decodeHDR( texture2D( texture, gl_FragCoord.xy * resolution ) );\n vec3 rgbM = rgbaM.xyz;\n float opacity = rgbaM.w;\n vec3 luma = vec3( 0.299, 0.587, 0.114 );\n float lumaNW = dot( rgbNW, luma );\n float lumaNE = dot( rgbNE, luma );\n float lumaSW = dot( rgbSW, luma );\n float lumaSE = dot( rgbSE, luma );\n float lumaM = dot( rgbM, luma );\n float lumaMin = min( lumaM, min( min( lumaNW, lumaNE ), min( lumaSW, lumaSE ) ) );\n float lumaMax = max( lumaM, max( max( lumaNW, lumaNE) , max( lumaSW, lumaSE ) ) );\n vec2 dir;\n dir.x = -((lumaNW + lumaNE) - (lumaSW + lumaSE));\n dir.y = ((lumaNW + lumaSW) - (lumaNE + lumaSE));\n float dirReduce = max( ( lumaNW + lumaNE + lumaSW + lumaSE ) * ( 0.25 * FXAA_REDUCE_MUL ), FXAA_REDUCE_MIN );\n float rcpDirMin = 1.0 / ( min( abs( dir.x ), abs( dir.y ) ) + dirReduce );\n dir = min( vec2( FXAA_SPAN_MAX, FXAA_SPAN_MAX),\n max( vec2(-FXAA_SPAN_MAX, -FXAA_SPAN_MAX),\n dir * rcpDirMin)) * resolution;\n vec3 rgbA = decodeHDR( texture2D( texture, gl_FragCoord.xy * resolution + dir * ( 1.0 / 3.0 - 0.5 ) ) ).xyz;\n rgbA += decodeHDR( texture2D( texture, gl_FragCoord.xy * resolution + dir * ( 2.0 / 3.0 - 0.5 ) ) ).xyz;\n rgbA *= 0.5;\n vec3 rgbB = decodeHDR( texture2D( texture, gl_FragCoord.xy * resolution + dir * -0.5 ) ).xyz;\n rgbB += decodeHDR( texture2D( texture, gl_FragCoord.xy * resolution + dir * 0.5 ) ).xyz;\n rgbB *= 0.25;\n rgbB += rgbA * 0.5;\n float lumaB = dot( rgbB, luma );\n if ( ( lumaB < lumaMin ) || ( lumaB > lumaMax ) )\n {\n gl_FragColor = vec4( rgbA, opacity );\n }\n else {\n gl_FragColor = vec4( rgbB, opacity );\n }\n}\n@end";
                    ! function (e) {
                      e.import("@export clay.compositor.coloradjust\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\nuniform float brightness : 0.0;\nuniform float contrast : 1.0;\nuniform float exposure : 0.0;\nuniform float gamma : 1.0;\nuniform float saturation : 1.0;\nconst vec3 w = vec3(0.2125, 0.7154, 0.0721);\nvoid main()\n{\n vec4 tex = texture2D( texture, v_Texcoord);\n vec3 color = clamp(tex.rgb + vec3(brightness), 0.0, 1.0);\n color = clamp( (color-vec3(0.5))*contrast+vec3(0.5), 0.0, 1.0);\n color = clamp( color * pow(2.0, exposure), 0.0, 1.0);\n color = clamp( pow(color, vec3(gamma)), 0.0, 1.0);\n float luminance = dot( color, w );\n color = mix(vec3(luminance), color, saturation);\n gl_FragColor = vec4(color, tex.a);\n}\n@end\n@export clay.compositor.brightness\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\nuniform float brightness : 0.0;\nvoid main()\n{\n vec4 tex = texture2D( texture, v_Texcoord);\n vec3 color = tex.rgb + vec3(brightness);\n gl_FragColor = vec4(color, tex.a);\n}\n@end\n@export clay.compositor.contrast\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\nuniform float contrast : 1.0;\nvoid main()\n{\n vec4 tex = texture2D( texture, v_Texcoord);\n vec3 color = (tex.rgb-vec3(0.5))*contrast+vec3(0.5);\n gl_FragColor = vec4(color, tex.a);\n}\n@end\n@export clay.compositor.exposure\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\nuniform float exposure : 0.0;\nvoid main()\n{\n vec4 tex = texture2D(texture, v_Texcoord);\n vec3 color = tex.rgb * pow(2.0, exposure);\n gl_FragColor = vec4(color, tex.a);\n}\n@end\n@export clay.compositor.gamma\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\nuniform float gamma : 1.0;\nvoid main()\n{\n vec4 tex = texture2D(texture, v_Texcoord);\n vec3 color = pow(tex.rgb, vec3(gamma));\n gl_FragColor = vec4(color, tex.a);\n}\n@end\n@export clay.compositor.saturation\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\nuniform float saturation : 1.0;\nconst vec3 w = vec3(0.2125, 0.7154, 0.0721);\nvoid main()\n{\n vec4 tex = texture2D(texture, v_Texcoord);\n vec3 color = tex.rgb;\n float luminance = dot(color, w);\n color = mix(vec3(luminance), color, saturation);\n gl_FragColor = vec4(color, tex.a);\n}\n@end"), e.import(Zs), e.import("@export clay.compositor.hdr.log_lum\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\nconst vec3 w = vec3(0.2125, 0.7154, 0.0721);\n@import clay.util.rgbm\nvoid main()\n{\n vec4 tex = decodeHDR(texture2D(texture, v_Texcoord));\n float luminance = dot(tex.rgb, w);\n luminance = log(luminance + 0.001);\n gl_FragColor = encodeHDR(vec4(vec3(luminance), 1.0));\n}\n@end\n@export clay.compositor.hdr.lum_adaption\nvarying vec2 v_Texcoord;\nuniform sampler2D adaptedLum;\nuniform sampler2D currentLum;\nuniform float frameTime : 0.02;\n@import clay.util.rgbm\nvoid main()\n{\n float fAdaptedLum = decodeHDR(texture2D(adaptedLum, vec2(0.5, 0.5))).r;\n float fCurrentLum = exp(encodeHDR(texture2D(currentLum, vec2(0.5, 0.5))).r);\n fAdaptedLum += (fCurrentLum - fAdaptedLum) * (1.0 - pow(0.98, 30.0 * frameTime));\n gl_FragColor = encodeHDR(vec4(vec3(fAdaptedLum), 1.0));\n}\n@end\n@export clay.compositor.lum\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\nconst vec3 w = vec3(0.2125, 0.7154, 0.0721);\nvoid main()\n{\n vec4 tex = texture2D( texture, v_Texcoord );\n float luminance = dot(tex.rgb, w);\n gl_FragColor = vec4(vec3(luminance), 1.0);\n}\n@end"), e.import(Ys), e.import("@export clay.compositor.vignette\n#define OUTPUT_ALPHA\nvarying vec2 v_Texcoord;\nuniform sampler2D texture;\nuniform float darkness: 1;\nuniform float offset: 1;\n@import clay.util.rgbm\nvoid main()\n{\n vec4 texel = decodeHDR(texture2D(texture, v_Texcoord));\n gl_FragColor.rgb = texel.rgb;\n vec2 uv = (v_Texcoord - vec2(0.5)) * vec2(offset);\n gl_FragColor = encodeHDR(vec4(mix(texel.rgb, vec3(1.0 - darkness), dot(uv, uv)), texel.a));\n}\n@end"), e.import(Ks), e.import(Qs), e.import(Js), e.import($s), e.import(el), e.import("@export clay.compositor.lensflare\n#define SAMPLE_NUMBER 8\nuniform sampler2D texture;\nuniform sampler2D lenscolor;\nuniform vec2 textureSize : [512, 512];\nuniform float dispersal : 0.3;\nuniform float haloWidth : 0.4;\nuniform float distortion : 1.0;\nvarying vec2 v_Texcoord;\n@import clay.util.rgbm\nvec4 textureDistorted(\n in vec2 texcoord,\n in vec2 direction,\n in vec3 distortion\n) {\n return vec4(\n decodeHDR(texture2D(texture, texcoord + direction * distortion.r)).r,\n decodeHDR(texture2D(texture, texcoord + direction * distortion.g)).g,\n decodeHDR(texture2D(texture, texcoord + direction * distortion.b)).b,\n 1.0\n );\n}\nvoid main()\n{\n vec2 texcoord = -v_Texcoord + vec2(1.0); vec2 textureOffset = 1.0 / textureSize;\n vec2 ghostVec = (vec2(0.5) - texcoord) * dispersal;\n vec2 haloVec = normalize(ghostVec) * haloWidth;\n vec3 distortion = vec3(-textureOffset.x * distortion, 0.0, textureOffset.x * distortion);\n vec4 result = vec4(0.0);\n for (int i = 0; i < SAMPLE_NUMBER; i++)\n {\n vec2 offset = fract(texcoord + ghostVec * float(i));\n float weight = length(vec2(0.5) - offset) / length(vec2(0.5));\n weight = pow(1.0 - weight, 10.0);\n result += textureDistorted(offset, normalize(ghostVec), distortion) * weight;\n }\n result *= texture2D(lenscolor, vec2(length(vec2(0.5) - texcoord)) / length(vec2(0.5)));\n float weight = length(vec2(0.5) - fract(texcoord + haloVec)) / length(vec2(0.5));\n weight = pow(1.0 - weight, 10.0);\n vec2 offset = fract(texcoord + haloVec);\n result += textureDistorted(offset, normalize(ghostVec), distortion) * weight;\n gl_FragColor = result;\n}\n@end"), e.import(tl), e.import(rl)
                    }(Xe);
                    var il = /^#source\((.*?)\)/;

                    function nl(e, t, r) {
                      var i, n, a, o, s = e.type || "filter";
                      if ("filter" === s) {
                        var l = e.shader.trim(),
                          h = il.exec(l);
                        if (h ? i = Xe.source(h[1].trim()) : "#" === l.charAt(0) && (i = t.shaders[l.substr(1)]), i || (i = l), !i) return
                      }
                      if (e.inputs)
                        for (var u in n = {}, e.inputs) "string" == typeof e.inputs[u] ? n[u] = e.inputs[u] : n[u] = {
                          node: e.inputs[u].node,
                          pin: e.inputs[u].pin
                        };
                      if (e.outputs)
                        for (var u in a = {}, e.outputs) {
                          var c = e.outputs[u];
                          a[u] = {}, null != c.attachment && (a[u].attachment = c.attachment), null != c.keepLastFrame && (a[u].keepLastFrame = c.keepLastFrame), null != c.outputLastFrame && (a[u].outputLastFrame = c.outputLastFrame), c.parameters && (a[u].parameters = sl(c.parameters))
                        }
                      if (o = "scene" === s ? new js({
                          name: e.name,
                          scene: r.scene,
                          camera: r.camera,
                          outputs: a
                        }) : "texture" === s ? new Xs({
                          name: e.name,
                          outputs: a
                        }) : new qs({
                          name: e.name,
                          shader: i,
                          inputs: n,
                          outputs: a
                        })) {
                        if (e.parameters)
                          for (var u in e.parameters) "string" == typeof (d = e.parameters[u]) ? "#" === (d = d.trim()).charAt(0) ? d = t.textures[d.substr(1)] : o.on("beforerender", ll(u, hl(d))) : "function" == typeof d && o.on("beforerender", d), o.setParameter(u, d);
                        if (e.defines && o.pass)
                          for (var u in e.defines) {
                            var d = e.defines[u];
                            o.pass.material.define("fragment", u, d)
                          }
                      }
                      return o
                    }

                    function al(e, t) {
                      return e
                    }

                    function ol(e, t) {
                      return t
                    }

                    function sl(e) {
                      var t = {};
                      if (!e) return t;
                      ["type", "minFilter", "magFilter", "wrapS", "wrapT", "flipY", "useMipmap"].forEach((function (r) {
                        var i = e[r];
                        null != i && ("string" == typeof i && (i = wr[i]), t[r] = i)
                      }));
                      var r = e.scale || 1;
                      return ["width", "height"].forEach((function (i) {
                        if (null != e[i]) {
                          var n = e[i];
                          "string" == typeof n ? (n = n.trim(), t[i] = (a = hl(n), o = (o = r) || 1, function (e) {
                            var t = e.getDevicePixelRatio(),
                              r = e.getWidth() * o,
                              i = e.getHeight() * o;
                            return a(r, i, t)
                          })) : t[i] = n
                        }
                        var a, o
                      })), t.width || (t.width = al), t.height || (t.height = ol), null != e.useMipmap && (t.useMipmap = e.useMipmap), t
                    }

                    function ll(e, t) {
                      return function (r) {
                        var i = r.getDevicePixelRatio(),
                          n = r.getWidth(),
                          a = r.getHeight(),
                          o = t(n, a, i);
                        this.setParameter(e, o)
                      }
                    }

                    function hl(e) {
                      var t = /^expr\((.*)\)$/.exec(e);
                      if (t) try {
                        var r = new Function("width", "height", "dpr", "return " + t[1]);
                        return r(1, 1), r
                      } catch (e) {
                        throw new Error("Invalid expression.")
                      }
                    }
                    const ul = function (e, t) {
                      for (var r = 0, i = 1 / t, n = e; n > 0;) r += i * (n % t), n = Math.floor(n / t), i /= t;
                      return r
                    };

                    function cl(e) {
                      for (var t = new Uint8Array(e * e * 4), r = 0, i = new vt, n = 0; n < e; n++)
                        for (var a = 0; a < e; a++) i.set(2 * Math.random() - 1, 2 * Math.random() - 1, 0).normalize(), t[r++] = 255 * (.5 * i.x + .5), t[r++] = 255 * (.5 * i.y + .5), t[r++] = 0, t[r++] = 255;
                      return t
                    }

                    function dl(e) {
                      return new Dr({
                        pixels: cl(e),
                        wrapS: wr.REPEAT,
                        wrapT: wr.REPEAT,
                        width: e,
                        height: e
                      })
                    }

                    function fl(e, t, r) {
                      var i = new Float32Array(3 * e);
                      t = t || 0;
                      for (var n = 0; n < e; n++) {
                        var a = ul(n + t, 2) * (r ? 1 : 2) * Math.PI,
                          o = ul(n + t, 3) * Math.PI,
                          s = Math.random(),
                          l = Math.cos(a) * Math.sin(o) * s,
                          h = Math.cos(o) * s,
                          u = Math.sin(a) * Math.sin(o) * s;
                        i[3 * n] = l, i[3 * n + 1] = h, i[3 * n + 2] = u
                      }
                      return i
                    }

                    function pl(e) {
                      e = e || {}, this._ssaoPass = new pn({
                        fragment: Xe.source("ecgl.ssao.estimate")
                      }), this._blurPass = new pn({
                        fragment: Xe.source("ecgl.ssao.blur")
                      }), this._framebuffer = new zi({
                        depthBuffer: !1
                      }), this._ssaoTexture = new Dr, this._blurTexture = new Dr, this._blurTexture2 = new Dr, this._depthTex = e.depthTexture, this._normalTex = e.normalTexture, this.setNoiseSize(4), this.setKernelSize(e.kernelSize || 12), null != e.radius && this.setParameter("radius", e.radius), null != e.power && this.setParameter("power", e.power), this._normalTex || (this._ssaoPass.material.disableTexture("normalTex"), this._blurPass.material.disableTexture("normalTex")), this._depthTex || this._blurPass.material.disableTexture("depthTex"), this._blurPass.material.setUniform("normalTex", this._normalTex), this._blurPass.material.setUniform("depthTex", this._depthTex)
                    }
                    Xe.import("@export ecgl.ssao.estimate\n\nuniform sampler2D depthTex;\n\nuniform sampler2D normalTex;\n\nuniform sampler2D noiseTex;\n\nuniform vec2 depthTexSize;\n\nuniform vec2 noiseTexSize;\n\nuniform mat4 projection;\n\nuniform mat4 projectionInv;\n\nuniform mat4 viewInverseTranspose;\n\nuniform vec3 kernel[KERNEL_SIZE];\n\nuniform float radius : 1;\n\nuniform float power : 1;\n\nuniform float bias: 1e-2;\n\nuniform float intensity: 1.0;\n\nvarying vec2 v_Texcoord;\n\nfloat ssaoEstimator(in vec3 originPos, in mat3 kernelBasis) {\n float occlusion = 0.0;\n\n for (int i = 0; i < KERNEL_SIZE; i++) {\n vec3 samplePos = kernel[i];\n#ifdef NORMALTEX_ENABLED\n samplePos = kernelBasis * samplePos;\n#endif\n samplePos = samplePos * radius + originPos;\n\n vec4 texCoord = projection * vec4(samplePos, 1.0);\n texCoord.xy /= texCoord.w;\n\n vec4 depthTexel = texture2D(depthTex, texCoord.xy * 0.5 + 0.5);\n\n float sampleDepth = depthTexel.r * 2.0 - 1.0;\n if (projection[3][3] == 0.0) {\n sampleDepth = projection[3][2] / (sampleDepth * projection[2][3] - projection[2][2]);\n }\n else {\n sampleDepth = (sampleDepth - projection[3][2]) / projection[2][2];\n }\n \n float rangeCheck = smoothstep(0.0, 1.0, radius / abs(originPos.z - sampleDepth));\n occlusion += rangeCheck * step(samplePos.z, sampleDepth - bias);\n }\n#ifdef NORMALTEX_ENABLED\n occlusion = 1.0 - occlusion / float(KERNEL_SIZE);\n#else\n occlusion = 1.0 - clamp((occlusion / float(KERNEL_SIZE) - 0.6) * 2.5, 0.0, 1.0);\n#endif\n return pow(occlusion, power);\n}\n\nvoid main()\n{\n\n vec4 depthTexel = texture2D(depthTex, v_Texcoord);\n\n#ifdef NORMALTEX_ENABLED\n vec4 tex = texture2D(normalTex, v_Texcoord);\n if (dot(tex.rgb, tex.rgb) == 0.0) {\n gl_FragColor = vec4(1.0);\n return;\n }\n vec3 N = tex.rgb * 2.0 - 1.0;\n N = (viewInverseTranspose * vec4(N, 0.0)).xyz;\n\n vec2 noiseTexCoord = depthTexSize / vec2(noiseTexSize) * v_Texcoord;\n vec3 rvec = texture2D(noiseTex, noiseTexCoord).rgb * 2.0 - 1.0;\n vec3 T = normalize(rvec - N * dot(rvec, N));\n vec3 BT = normalize(cross(N, T));\n mat3 kernelBasis = mat3(T, BT, N);\n#else\n if (depthTexel.r > 0.99999) {\n gl_FragColor = vec4(1.0);\n return;\n }\n mat3 kernelBasis;\n#endif\n\n float z = depthTexel.r * 2.0 - 1.0;\n\n vec4 projectedPos = vec4(v_Texcoord * 2.0 - 1.0, z, 1.0);\n vec4 p4 = projectionInv * projectedPos;\n\n vec3 position = p4.xyz / p4.w;\n\n float ao = ssaoEstimator(position, kernelBasis);\n ao = clamp(1.0 - (1.0 - ao) * intensity, 0.0, 1.0);\n gl_FragColor = vec4(vec3(ao), 1.0);\n}\n\n@end\n\n\n@export ecgl.ssao.blur\n#define SHADER_NAME SSAO_BLUR\n\nuniform sampler2D ssaoTexture;\n\n#ifdef NORMALTEX_ENABLED\nuniform sampler2D normalTex;\n#endif\n\nvarying vec2 v_Texcoord;\n\nuniform vec2 textureSize;\nuniform float blurSize : 1.0;\n\nuniform int direction: 0.0;\n\n#ifdef DEPTHTEX_ENABLED\nuniform sampler2D depthTex;\nuniform mat4 projection;\nuniform float depthRange : 0.5;\n\nfloat getLinearDepth(vec2 coord)\n{\n float depth = texture2D(depthTex, coord).r * 2.0 - 1.0;\n return projection[3][2] / (depth * projection[2][3] - projection[2][2]);\n}\n#endif\n\nvoid main()\n{\n float kernel[5];\n kernel[0] = 0.122581;\n kernel[1] = 0.233062;\n kernel[2] = 0.288713;\n kernel[3] = 0.233062;\n kernel[4] = 0.122581;\n\n vec2 off = vec2(0.0);\n if (direction == 0) {\n off[0] = blurSize / textureSize.x;\n }\n else {\n off[1] = blurSize / textureSize.y;\n }\n\n vec2 coord = v_Texcoord;\n\n float sum = 0.0;\n float weightAll = 0.0;\n\n#ifdef NORMALTEX_ENABLED\n vec3 centerNormal = texture2D(normalTex, v_Texcoord).rgb * 2.0 - 1.0;\n#endif\n#if defined(DEPTHTEX_ENABLED)\n float centerDepth = getLinearDepth(v_Texcoord);\n#endif\n\n for (int i = 0; i < 5; i++) {\n vec2 coord = clamp(v_Texcoord + vec2(float(i) - 2.0) * off, vec2(0.0), vec2(1.0));\n\n float w = kernel[i];\n#ifdef NORMALTEX_ENABLED\n vec3 normal = texture2D(normalTex, coord).rgb * 2.0 - 1.0;\n w *= clamp(dot(normal, centerNormal), 0.0, 1.0);\n#endif\n#ifdef DEPTHTEX_ENABLED\n float d = getLinearDepth(coord);\n w *= (1.0 - smoothstep(abs(centerDepth - d) / depthRange, 0.0, 1.0));\n#endif\n\n weightAll += w;\n sum += texture2D(ssaoTexture, coord).r * w;\n }\n\n gl_FragColor = vec4(vec3(sum / weightAll), 1.0);\n}\n\n@end\n"), pl.prototype.setDepthTexture = function (e) {
                      this._depthTex = e
                    }, pl.prototype.setNormalTexture = function (e) {
                      this._normalTex = e, this._ssaoPass.material[e ? "enableTexture" : "disableTexture"]("normalTex"), this.setKernelSize(this._kernelSize)
                    }, pl.prototype.update = function (e, t, r) {
                      var i = e.getWidth(),
                        n = e.getHeight(),
                        a = this._ssaoPass,
                        o = this._blurPass;
                      a.setUniform("kernel", this._kernels[r % this._kernels.length]), a.setUniform("depthTex", this._depthTex), null != this._normalTex && a.setUniform("normalTex", this._normalTex), a.setUniform("depthTexSize", [this._depthTex.width, this._depthTex.height]);
                      var s = new Ht;
                      Ht.transpose(s, t.worldTransform), a.setUniform("projection", t.projectionMatrix.array), a.setUniform("projectionInv", t.invProjectionMatrix.array), a.setUniform("viewInverseTranspose", s.array);
                      var l = this._ssaoTexture,
                        h = this._blurTexture,
                        u = this._blurTexture2;
                      l.width = i / 2, l.height = n / 2, h.width = i, h.height = n, u.width = i, u.height = n, this._framebuffer.attach(l), this._framebuffer.bind(e), e.gl.clearColor(1, 1, 1, 1), e.gl.clear(e.gl.COLOR_BUFFER_BIT), a.render(e), o.setUniform("textureSize", [i / 2, n / 2]), o.setUniform("projection", t.projectionMatrix.array), this._framebuffer.attach(h), o.setUniform("direction", 0), o.setUniform("ssaoTexture", l), o.render(e), this._framebuffer.attach(u), o.setUniform("textureSize", [i, n]), o.setUniform("direction", 1), o.setUniform("ssaoTexture", h), o.render(e), this._framebuffer.unbind(e);
                      var c = e.clearColor;
                      e.gl.clearColor(c[0], c[1], c[2], c[3])
                    }, pl.prototype.getTargetTexture = function () {
                      return this._blurTexture2
                    }, pl.prototype.setParameter = function (e, t) {
                      "noiseTexSize" === e ? this.setNoiseSize(t) : "kernelSize" === e ? this.setKernelSize(t) : "intensity" === e ? this._ssaoPass.material.set("intensity", t) : this._ssaoPass.setUniform(e, t)
                    }, pl.prototype.setKernelSize = function (e) {
                      this._kernelSize = e, this._ssaoPass.material.define("fragment", "KERNEL_SIZE", e), this._kernels = this._kernels || [];
                      for (var t = 0; t < 30; t++) this._kernels[t] = fl(e, t * e, !!this._normalTex)
                    }, pl.prototype.setNoiseSize = function (e) {
                      var t = this._ssaoPass.getUniform("noiseTex");
                      t ? (t.data = cl(e), t.width = t.height = e, t.dirty()) : (t = dl(e), this._ssaoPass.setUniform("noiseTex", dl(e))), this._ssaoPass.setUniform("noiseTexSize", [e, e])
                    }, pl.prototype.dispose = function (e) {
                      this._blurTexture.dispose(e), this._ssaoTexture.dispose(e), this._blurTexture2.dispose(e)
                    };
                    const ml = pl;

                    function gl(e) {
                      e = e || {}, this._ssrPass = new pn({
                        fragment: Xe.source("ecgl.ssr.main"),
                        clearColor: [0, 0, 0, 0]
                      }), this._blurPass1 = new pn({
                        fragment: Xe.source("ecgl.ssr.blur"),
                        clearColor: [0, 0, 0, 0]
                      }), this._blurPass2 = new pn({
                        fragment: Xe.source("ecgl.ssr.blur"),
                        clearColor: [0, 0, 0, 0]
                      }), this._blendPass = new pn({
                        fragment: Xe.source("clay.compositor.blend")
                      }), this._blendPass.material.disableTexturesAll(), this._blendPass.material.enableTexture(["texture1", "texture2"]), this._ssrPass.setUniform("gBufferTexture1", e.normalTexture), this._ssrPass.setUniform("gBufferTexture2", e.depthTexture), this._blurPass1.setUniform("gBufferTexture1", e.normalTexture), this._blurPass1.setUniform("gBufferTexture2", e.depthTexture), this._blurPass2.setUniform("gBufferTexture1", e.normalTexture), this._blurPass2.setUniform("gBufferTexture2", e.depthTexture), this._blurPass2.material.define("fragment", "VERTICAL"), this._blurPass2.material.define("fragment", "BLEND"), this._ssrTexture = new Dr({
                        type: wr.HALF_FLOAT
                      }), this._texture2 = new Dr({
                        type: wr.HALF_FLOAT
                      }), this._texture3 = new Dr({
                        type: wr.HALF_FLOAT
                      }), this._prevTexture = new Dr({
                        type: wr.HALF_FLOAT
                      }), this._currentTexture = new Dr({
                        type: wr.HALF_FLOAT
                      }), this._frameBuffer = new zi({
                        depthBuffer: !1
                      }), this._normalDistribution = null, this._totalSamples = 256, this._samplePerFrame = 4, this._ssrPass.material.define("fragment", "SAMPLE_PER_FRAME", this._samplePerFrame), this._ssrPass.material.define("fragment", "TOTAL_SAMPLES", this._totalSamples), this._downScale = 1
                    }
                    Xe.import("@export ecgl.ssr.main\n\n#define SHADER_NAME SSR\n#define MAX_ITERATION 20;\n#define SAMPLE_PER_FRAME 5;\n#define TOTAL_SAMPLES 128;\n\nuniform sampler2D sourceTexture;\nuniform sampler2D gBufferTexture1;\nuniform sampler2D gBufferTexture2;\nuniform sampler2D gBufferTexture3;\nuniform samplerCube specularCubemap;\nuniform float specularIntensity: 1;\n\nuniform mat4 projection;\nuniform mat4 projectionInv;\nuniform mat4 toViewSpace;\nuniform mat4 toWorldSpace;\n\nuniform float maxRayDistance: 200;\n\nuniform float pixelStride: 16;\nuniform float pixelStrideZCutoff: 50; \nuniform float screenEdgeFadeStart: 0.9; \nuniform float eyeFadeStart : 0.2; uniform float eyeFadeEnd: 0.8; \nuniform float minGlossiness: 0.2; uniform float zThicknessThreshold: 1;\n\nuniform float nearZ;\nuniform vec2 viewportSize : VIEWPORT_SIZE;\n\nuniform float jitterOffset: 0;\n\nvarying vec2 v_Texcoord;\n\n#ifdef DEPTH_DECODE\n@import clay.util.decode_float\n#endif\n\n#ifdef PHYSICALLY_CORRECT\nuniform sampler2D normalDistribution;\nuniform float sampleOffset: 0;\nuniform vec2 normalDistributionSize;\n\nvec3 transformNormal(vec3 H, vec3 N) {\n vec3 upVector = N.y > 0.999 ? vec3(1.0, 0.0, 0.0) : vec3(0.0, 1.0, 0.0);\n vec3 tangentX = normalize(cross(N, upVector));\n vec3 tangentZ = cross(N, tangentX);\n return normalize(tangentX * H.x + N * H.y + tangentZ * H.z);\n}\nvec3 importanceSampleNormalGGX(float i, float roughness, vec3 N) {\n float p = fract((i + sampleOffset) / float(TOTAL_SAMPLES));\n vec3 H = texture2D(normalDistribution,vec2(roughness, p)).rgb;\n return transformNormal(H, N);\n}\nfloat G_Smith(float g, float ndv, float ndl) {\n float roughness = 1.0 - g;\n float k = roughness * roughness / 2.0;\n float G1V = ndv / (ndv * (1.0 - k) + k);\n float G1L = ndl / (ndl * (1.0 - k) + k);\n return G1L * G1V;\n}\nvec3 F_Schlick(float ndv, vec3 spec) {\n return spec + (1.0 - spec) * pow(1.0 - ndv, 5.0);\n}\n#endif\n\nfloat fetchDepth(sampler2D depthTexture, vec2 uv)\n{\n vec4 depthTexel = texture2D(depthTexture, uv);\n return depthTexel.r * 2.0 - 1.0;\n}\n\nfloat linearDepth(float depth)\n{\n if (projection[3][3] == 0.0) {\n return projection[3][2] / (depth * projection[2][3] - projection[2][2]);\n }\n else {\n return (depth - projection[3][2]) / projection[2][2];\n }\n}\n\nbool rayIntersectDepth(float rayZNear, float rayZFar, vec2 hitPixel)\n{\n if (rayZFar > rayZNear)\n {\n float t = rayZFar; rayZFar = rayZNear; rayZNear = t;\n }\n float cameraZ = linearDepth(fetchDepth(gBufferTexture2, hitPixel));\n return rayZFar <= cameraZ && rayZNear >= cameraZ - zThicknessThreshold;\n}\n\n\nbool traceScreenSpaceRay(\n vec3 rayOrigin, vec3 rayDir, float jitter,\n out vec2 hitPixel, out vec3 hitPoint, out float iterationCount\n)\n{\n float rayLength = ((rayOrigin.z + rayDir.z * maxRayDistance) > -nearZ)\n ? (-nearZ - rayOrigin.z) / rayDir.z : maxRayDistance;\n\n vec3 rayEnd = rayOrigin + rayDir * rayLength;\n\n vec4 H0 = projection * vec4(rayOrigin, 1.0);\n vec4 H1 = projection * vec4(rayEnd, 1.0);\n\n float k0 = 1.0 / H0.w, k1 = 1.0 / H1.w;\n\n vec3 Q0 = rayOrigin * k0, Q1 = rayEnd * k1;\n\n vec2 P0 = (H0.xy * k0 * 0.5 + 0.5) * viewportSize;\n vec2 P1 = (H1.xy * k1 * 0.5 + 0.5) * viewportSize;\n\n P1 += dot(P1 - P0, P1 - P0) < 0.0001 ? 0.01 : 0.0;\n vec2 delta = P1 - P0;\n\n bool permute = false;\n if (abs(delta.x) < abs(delta.y)) {\n permute = true;\n delta = delta.yx;\n P0 = P0.yx;\n P1 = P1.yx;\n }\n float stepDir = sign(delta.x);\n float invdx = stepDir / delta.x;\n\n vec3 dQ = (Q1 - Q0) * invdx;\n float dk = (k1 - k0) * invdx;\n\n vec2 dP = vec2(stepDir, delta.y * invdx);\n\n float strideScaler = 1.0 - min(1.0, -rayOrigin.z / pixelStrideZCutoff);\n float pixStride = 1.0 + strideScaler * pixelStride;\n\n dP *= pixStride; dQ *= pixStride; dk *= pixStride;\n\n vec4 pqk = vec4(P0, Q0.z, k0);\n vec4 dPQK = vec4(dP, dQ.z, dk);\n\n pqk += dPQK * jitter;\n float rayZFar = (dPQK.z * 0.5 + pqk.z) / (dPQK.w * 0.5 + pqk.w);\n float rayZNear;\n\n bool intersect = false;\n\n vec2 texelSize = 1.0 / viewportSize;\n\n iterationCount = 0.0;\n\n for (int i = 0; i < MAX_ITERATION; i++)\n {\n pqk += dPQK;\n\n rayZNear = rayZFar;\n rayZFar = (dPQK.z * 0.5 + pqk.z) / (dPQK.w * 0.5 + pqk.w);\n\n hitPixel = permute ? pqk.yx : pqk.xy;\n hitPixel *= texelSize;\n\n intersect = rayIntersectDepth(rayZNear, rayZFar, hitPixel);\n\n iterationCount += 1.0;\n\n dPQK *= 1.2;\n\n if (intersect) {\n break;\n }\n }\n\n Q0.xy += dQ.xy * iterationCount;\n Q0.z = pqk.z;\n hitPoint = Q0 / pqk.w;\n\n return intersect;\n}\n\nfloat calculateAlpha(\n float iterationCount, float reflectivity,\n vec2 hitPixel, vec3 hitPoint, float dist, vec3 rayDir\n)\n{\n float alpha = clamp(reflectivity, 0.0, 1.0);\n alpha *= 1.0 - (iterationCount / float(MAX_ITERATION));\n vec2 hitPixelNDC = hitPixel * 2.0 - 1.0;\n float maxDimension = min(1.0, max(abs(hitPixelNDC.x), abs(hitPixelNDC.y)));\n alpha *= 1.0 - max(0.0, maxDimension - screenEdgeFadeStart) / (1.0 - screenEdgeFadeStart);\n\n float _eyeFadeStart = eyeFadeStart;\n float _eyeFadeEnd = eyeFadeEnd;\n if (_eyeFadeStart > _eyeFadeEnd) {\n float tmp = _eyeFadeEnd;\n _eyeFadeEnd = _eyeFadeStart;\n _eyeFadeStart = tmp;\n }\n\n float eyeDir = clamp(rayDir.z, _eyeFadeStart, _eyeFadeEnd);\n alpha *= 1.0 - (eyeDir - _eyeFadeStart) / (_eyeFadeEnd - _eyeFadeStart);\n\n alpha *= 1.0 - clamp(dist / maxRayDistance, 0.0, 1.0);\n\n return alpha;\n}\n\n@import clay.util.rand\n\n@import clay.util.rgbm\n\nvoid main()\n{\n vec4 normalAndGloss = texture2D(gBufferTexture1, v_Texcoord);\n\n if (dot(normalAndGloss.rgb, vec3(1.0)) == 0.0) {\n discard;\n }\n\n float g = normalAndGloss.a;\n#if !defined(PHYSICALLY_CORRECT)\n if (g <= minGlossiness) {\n discard;\n }\n#endif\n\n float reflectivity = (g - minGlossiness) / (1.0 - minGlossiness);\n\n vec3 N = normalize(normalAndGloss.rgb * 2.0 - 1.0);\n N = normalize((toViewSpace * vec4(N, 0.0)).xyz);\n\n vec4 projectedPos = vec4(v_Texcoord * 2.0 - 1.0, fetchDepth(gBufferTexture2, v_Texcoord), 1.0);\n vec4 pos = projectionInv * projectedPos;\n vec3 rayOrigin = pos.xyz / pos.w;\n vec3 V = -normalize(rayOrigin);\n\n float ndv = clamp(dot(N, V), 0.0, 1.0);\n float iterationCount;\n float jitter = rand(fract(v_Texcoord + jitterOffset));\n\n#ifdef PHYSICALLY_CORRECT\n vec4 color = vec4(vec3(0.0), 1.0);\n vec4 albedoMetalness = texture2D(gBufferTexture3, v_Texcoord);\n vec3 albedo = albedoMetalness.rgb;\n float m = albedoMetalness.a;\n vec3 diffuseColor = albedo * (1.0 - m);\n vec3 spec = mix(vec3(0.04), albedo, m);\n\n float jitter2 = rand(fract(v_Texcoord)) * float(TOTAL_SAMPLES);\n\n for (int i = 0; i < SAMPLE_PER_FRAME; i++) {\n vec3 H = importanceSampleNormalGGX(float(i) + jitter2, 1.0 - g, N);\n vec3 rayDir = normalize(reflect(-V, H));\n#else\n vec3 rayDir = normalize(reflect(-V, N));\n#endif\n vec2 hitPixel;\n vec3 hitPoint;\n\n bool intersect = traceScreenSpaceRay(rayOrigin, rayDir, jitter, hitPixel, hitPoint, iterationCount);\n\n float dist = distance(rayOrigin, hitPoint);\n\n vec3 hitNormal = texture2D(gBufferTexture1, hitPixel).rgb * 2.0 - 1.0;\n hitNormal = normalize((toViewSpace * vec4(hitNormal, 0.0)).xyz);\n#ifdef PHYSICALLY_CORRECT\n float ndl = clamp(dot(N, rayDir), 0.0, 1.0);\n float vdh = clamp(dot(V, H), 0.0, 1.0);\n float ndh = clamp(dot(N, H), 0.0, 1.0);\n vec3 litTexel = vec3(0.0);\n if (dot(hitNormal, rayDir) < 0.0 && intersect) {\n litTexel = texture2D(sourceTexture, hitPixel).rgb;\n litTexel *= pow(clamp(1.0 - dist / 200.0, 0.0, 1.0), 3.0);\n\n }\n else {\n #ifdef SPECULARCUBEMAP_ENABLED\n vec3 rayDirW = normalize(toWorldSpace * vec4(rayDir, 0.0)).rgb;\n litTexel = RGBMDecode(textureCubeLodEXT(specularCubemap, rayDirW, 0.0), 8.12).rgb * specularIntensity;\n#endif\n }\n color.rgb += ndl * litTexel * (\n F_Schlick(ndl, spec) * G_Smith(g, ndv, ndl) * vdh / (ndh * ndv + 0.001)\n );\n }\n color.rgb /= float(SAMPLE_PER_FRAME);\n#else\n #if !defined(SPECULARCUBEMAP_ENABLED)\n if (dot(hitNormal, rayDir) >= 0.0) {\n discard;\n }\n if (!intersect) {\n discard;\n }\n#endif\n float alpha = clamp(calculateAlpha(iterationCount, reflectivity, hitPixel, hitPoint, dist, rayDir), 0.0, 1.0);\n vec4 color = texture2D(sourceTexture, hitPixel);\n color.rgb *= alpha;\n\n#ifdef SPECULARCUBEMAP_ENABLED\n vec3 rayDirW = normalize(toWorldSpace * vec4(rayDir, 0.0)).rgb;\n alpha = alpha * (intersect ? 1.0 : 0.0);\n float bias = (1.0 -g) * 5.0;\n color.rgb += (1.0 - alpha)\n * RGBMDecode(textureCubeLodEXT(specularCubemap, rayDirW, bias), 8.12).rgb\n * specularIntensity;\n#endif\n\n#endif\n\n gl_FragColor = encodeHDR(color);\n}\n@end\n\n@export ecgl.ssr.blur\n\nuniform sampler2D texture;\nuniform sampler2D gBufferTexture1;\nuniform sampler2D gBufferTexture2;\nuniform mat4 projection;\nuniform float depthRange : 0.05;\n\nvarying vec2 v_Texcoord;\n\nuniform vec2 textureSize;\nuniform float blurSize : 1.0;\n\n#ifdef BLEND\n #ifdef SSAOTEX_ENABLED\nuniform sampler2D ssaoTex;\n #endif\nuniform sampler2D sourceTexture;\n#endif\n\nfloat getLinearDepth(vec2 coord)\n{\n float depth = texture2D(gBufferTexture2, coord).r * 2.0 - 1.0;\n return projection[3][2] / (depth * projection[2][3] - projection[2][2]);\n}\n\n@import clay.util.rgbm\n\n\nvoid main()\n{\n @import clay.compositor.kernel.gaussian_9\n\n vec4 centerNTexel = texture2D(gBufferTexture1, v_Texcoord);\n float g = centerNTexel.a;\n float maxBlurSize = clamp(1.0 - g, 0.0, 1.0) * blurSize;\n#ifdef VERTICAL\n vec2 off = vec2(0.0, maxBlurSize / textureSize.y);\n#else\n vec2 off = vec2(maxBlurSize / textureSize.x, 0.0);\n#endif\n\n vec2 coord = v_Texcoord;\n\n vec4 sum = vec4(0.0);\n float weightAll = 0.0;\n\n vec3 cN = centerNTexel.rgb * 2.0 - 1.0;\n float cD = getLinearDepth(v_Texcoord);\n for (int i = 0; i < 9; i++) {\n vec2 coord = clamp((float(i) - 4.0) * off + v_Texcoord, vec2(0.0), vec2(1.0));\n float w = gaussianKernel[i]\n * clamp(dot(cN, texture2D(gBufferTexture1, coord).rgb * 2.0 - 1.0), 0.0, 1.0);\n float d = getLinearDepth(coord);\n w *= (1.0 - smoothstep(abs(cD - d) / depthRange, 0.0, 1.0));\n\n weightAll += w;\n sum += decodeHDR(texture2D(texture, coord)) * w;\n }\n\n#ifdef BLEND\n float aoFactor = 1.0;\n #ifdef SSAOTEX_ENABLED\n aoFactor = texture2D(ssaoTex, v_Texcoord).r;\n #endif\n gl_FragColor = encodeHDR(\n sum / weightAll * aoFactor + decodeHDR(texture2D(sourceTexture, v_Texcoord))\n );\n#else\n gl_FragColor = encodeHDR(sum / weightAll);\n#endif\n}\n\n@end"), gl.prototype.setAmbientCubemap = function (e, t) {
                      this._ssrPass.material.set("specularCubemap", e), this._ssrPass.material.set("specularIntensity", t);
                      var r = e && t;
                      this._ssrPass.material[r ? "enableTexture" : "disableTexture"]("specularCubemap")
                    }, gl.prototype.update = function (e, t, r, i) {
                      var n = e.getWidth(),
                        a = e.getHeight(),
                        o = this._ssrTexture,
                        s = this._texture2,
                        l = this._texture3;
                      o.width = this._prevTexture.width = this._currentTexture.width = n / this._downScale, o.height = this._prevTexture.height = this._currentTexture.height = a / this._downScale, s.width = l.width = n, s.height = l.height = a;
                      var h = this._frameBuffer,
                        u = this._ssrPass,
                        c = this._blurPass1,
                        d = this._blurPass2,
                        f = this._blendPass,
                        p = new Ht,
                        m = new Ht;
                      Ht.transpose(p, t.worldTransform), Ht.transpose(m, t.viewMatrix), u.setUniform("sourceTexture", r), u.setUniform("projection", t.projectionMatrix.array), u.setUniform("projectionInv", t.invProjectionMatrix.array), u.setUniform("toViewSpace", p.array), u.setUniform("toWorldSpace", m.array), u.setUniform("nearZ", t.near);
                      var g = i / this._totalSamples * this._samplePerFrame;
                      if (u.setUniform("jitterOffset", g), u.setUniform("sampleOffset", i * this._samplePerFrame), c.setUniform("textureSize", [o.width, o.height]), d.setUniform("textureSize", [n, a]), d.setUniform("sourceTexture", r), c.setUniform("projection", t.projectionMatrix.array), d.setUniform("projection", t.projectionMatrix.array), h.attach(o), h.bind(e), u.render(e), this._physicallyCorrect && (h.attach(this._currentTexture), f.setUniform("texture1", this._prevTexture), f.setUniform("texture2", o), f.material.set({
                          weight1: i >= 1 ? .95 : 0,
                          weight2: i >= 1 ? .05 : 1
                        }), f.render(e)), h.attach(s), c.setUniform("texture", this._physicallyCorrect ? this._currentTexture : o), c.render(e), h.attach(l), d.setUniform("texture", s), d.render(e), h.unbind(e), this._physicallyCorrect) {
                        var _ = this._prevTexture;
                        this._prevTexture = this._currentTexture, this._currentTexture = _
                      }
                    }, gl.prototype.getTargetTexture = function () {
                      return this._texture3
                    }, gl.prototype.setParameter = function (e, t) {
                      "maxIteration" === e ? this._ssrPass.material.define("fragment", "MAX_ITERATION", t) : this._ssrPass.setUniform(e, t)
                    }, gl.prototype.setPhysicallyCorrect = function (e) {
                      e ? (this._normalDistribution || (this._normalDistribution = _n.generateNormalDistribution(64, this._totalSamples)), this._ssrPass.material.define("fragment", "PHYSICALLY_CORRECT"), this._ssrPass.material.set("normalDistribution", this._normalDistribution), this._ssrPass.material.set("normalDistributionSize", [64, this._totalSamples])) : this._ssrPass.material.undefine("fragment", "PHYSICALLY_CORRECT"), this._physicallyCorrect = e
                    }, gl.prototype.setSSAOTexture = function (e) {
                      var t = this._blurPass2;
                      e ? (t.material.enableTexture("ssaoTex"), t.material.set("ssaoTex", e)) : t.material.disableTexture("ssaoTex")
                    }, gl.prototype.isFinished = function (e) {
                      return !this._physicallyCorrect || e > this._totalSamples / this._samplePerFrame
                    }, gl.prototype.dispose = function (e) {
                      this._ssrTexture.dispose(e), this._texture2.dispose(e), this._texture3.dispose(e), this._prevTexture.dispose(e), this._currentTexture.dispose(e), this._frameBuffer.dispose(e)
                    };
                    const _l = gl,
                      vl = [0, 0, -.321585265978, -.154972575841, .458126042375, .188473391593, .842080129861, .527766490688, .147304551086, -.659453822776, -.331943915203, -.940619700594, .0479226680259, .54812163202, .701581552186, -.709825561388, -.295436780218, .940589268233, -.901489676764, .237713156085, .973570876096, -.109899459384, -.866792314779, -.451805525005, .330975007087, .800048655954, -.344275183665, .381779221166, -.386139432542, -.437418421534, -.576478634965, -.0148463392551, .385798197415, -.262426961053, -.666302061145, .682427250835, -.628010632582, -.732836215494, .10163141741, -.987658134403, .711995289051, -.320024291314, .0296005138058, .950296523438, .0130612307608, -.351024443122, -.879596633704, -.10478487883, .435712737232, .504254490347, .779203817497, .206477676721, .388264289969, -.896736162545, -.153106280781, -.629203242522, -.245517550697, .657969239148, .126830499058, .26862328493, -.634888119007, -.302301223431, .617074219636, .779817204925];

                    function yl(e, t, r, i, n) {
                      var a = e.gl;
                      t.setUniform(a, "1i", r, n), a.activeTexture(a.TEXTURE0 + n), i.isRenderable() ? i.bind(e) : i.unbind(e)
                    }

                    function xl(e, t, r, i, n) {
                      var a, o, s, l, h = e.gl;
                      return function (n, u, c) {
                        if (!l || l.material !== n.material) {
                          var d = n.material,
                            f = n.__program,
                            p = d.get("roughness");
                          null == p && (p = 1);
                          var m = d.get("normalMap") || t,
                            g = d.get("roughnessMap"),
                            _ = d.get("bumpMap"),
                            v = d.get("uvRepeat"),
                            y = d.get("uvOffset"),
                            x = d.get("detailUvRepeat"),
                            b = d.get("detailUvOffset"),
                            w = !!_ && d.isTextureEnabled("bumpMap"),
                            T = !!g && d.isTextureEnabled("roughnessMap"),
                            S = d.isDefined("fragment", "DOUBLE_SIDED");
                          _ = _ || r, g = g || i, c !== u ? (u.set("normalMap", m), u.set("bumpMap", _), u.set("roughnessMap", g), u.set("useBumpMap", w), u.set("useRoughnessMap", T), u.set("doubleSide", S), null != v && u.set("uvRepeat", v), null != y && u.set("uvOffset", y), null != x && u.set("detailUvRepeat", x), null != b && u.set("detailUvOffset", b), u.set("roughness", p)) : (f.setUniform(h, "1f", "roughness", p), a !== m && yl(e, f, "normalMap", m, 0), o !== _ && _ && yl(e, f, "bumpMap", _, 1), s !== g && g && yl(e, f, "roughnessMap", g, 2), null != v && f.setUniform(h, "2f", "uvRepeat", v), null != y && f.setUniform(h, "2f", "uvOffset", y), null != x && f.setUniform(h, "2f", "detailUvRepeat", x), null != b && f.setUniform(h, "2f", "detailUvOffset", b), f.setUniform(h, "1i", "useBumpMap", +w), f.setUniform(h, "1i", "useRoughnessMap", +T), f.setUniform(h, "1i", "doubleSide", +S)), a = m, o = _, s = g, l = n
                        }
                      }
                    }

                    function bl(e) {
                      e = e || {}, this._depthTex = new Dr({
                        format: wr.DEPTH_COMPONENT,
                        type: wr.UNSIGNED_INT
                      }), this._normalTex = new Dr({
                        type: wr.HALF_FLOAT
                      }), this._framebuffer = new zi, this._framebuffer.attach(this._normalTex), this._framebuffer.attach(this._depthTex, zi.DEPTH_ATTACHMENT), this._normalMaterial = new le({
                        shader: new Xe(Xe.source("ecgl.normal.vertex"), Xe.source("ecgl.normal.fragment"))
                      }), this._normalMaterial.enableTexture(["normalMap", "bumpMap", "roughnessMap"]), this._defaultNormalMap = an.createBlank("#000"), this._defaultBumpMap = an.createBlank("#000"), this._defaultRoughessMap = an.createBlank("#000"), this._debugPass = new pn({
                        fragment: Xe.source("clay.compositor.output")
                      }), this._debugPass.setUniform("texture", this._normalTex), this._debugPass.material.undefine("fragment", "OUTPUT_ALPHA")
                    }
                    Xe.import("@export ecgl.normal.vertex\n\n@import ecgl.common.transformUniforms\n\n@import ecgl.common.uv.header\n\n@import ecgl.common.attributes\n\nvarying vec3 v_Normal;\nvarying vec3 v_WorldPosition;\n\n@import ecgl.common.normalMap.vertexHeader\n\n@import ecgl.common.vertexAnimation.header\n\nvoid main()\n{\n\n @import ecgl.common.vertexAnimation.main\n\n @import ecgl.common.uv.main\n\n v_Normal = normalize((worldInverseTranspose * vec4(normal, 0.0)).xyz);\n v_WorldPosition = (world * vec4(pos, 1.0)).xyz;\n\n @import ecgl.common.normalMap.vertexMain\n\n gl_Position = worldViewProjection * vec4(pos, 1.0);\n\n}\n\n\n@end\n\n\n@export ecgl.normal.fragment\n\n#define ROUGHNESS_CHANEL 0\n\nuniform bool useBumpMap;\nuniform bool useRoughnessMap;\nuniform bool doubleSide;\nuniform float roughness;\n\n@import ecgl.common.uv.fragmentHeader\n\nvarying vec3 v_Normal;\nvarying vec3 v_WorldPosition;\n\nuniform mat4 viewInverse : VIEWINVERSE;\n\n@import ecgl.common.normalMap.fragmentHeader\n@import ecgl.common.bumpMap.header\n\nuniform sampler2D roughnessMap;\n\nvoid main()\n{\n vec3 N = v_Normal;\n \n bool flipNormal = false;\n if (doubleSide) {\n vec3 eyePos = viewInverse[3].xyz;\n vec3 V = normalize(eyePos - v_WorldPosition);\n\n if (dot(N, V) < 0.0) {\n flipNormal = true;\n }\n }\n\n @import ecgl.common.normalMap.fragmentMain\n\n if (useBumpMap) {\n N = bumpNormal(v_WorldPosition, v_Normal, N);\n }\n\n float g = 1.0 - roughness;\n\n if (useRoughnessMap) {\n float g2 = 1.0 - texture2D(roughnessMap, v_DetailTexcoord)[ROUGHNESS_CHANEL];\n g = clamp(g2 + (g - 0.5) * 2.0, 0.0, 1.0);\n }\n\n if (flipNormal) {\n N = -N;\n }\n\n gl_FragColor.rgb = (N.xyz + 1.0) * 0.5;\n gl_FragColor.a = g;\n}\n@end"), bl.prototype.getDepthTexture = function () {
                      return this._depthTex
                    }, bl.prototype.getNormalTexture = function () {
                      return this._normalTex
                    }, bl.prototype.update = function (e, t, r) {
                      var i = e.getWidth(),
                        n = e.getHeight(),
                        a = this._depthTex,
                        o = this._normalTex,
                        s = this._normalMaterial;
                      a.width = i, a.height = n, o.width = i, o.height = n;
                      var l = t.getRenderList(r).opaque;
                      this._framebuffer.bind(e), e.gl.clearColor(0, 0, 0, 0), e.gl.clear(e.gl.COLOR_BUFFER_BIT | e.gl.DEPTH_BUFFER_BIT), e.gl.disable(e.gl.BLEND), e.renderPass(l, r, {
                        getMaterial: function () {
                          return s
                        },
                        ifRender: function (e) {
                          return e.renderNormal
                        },
                        beforeRender: xl(e, this._defaultNormalMap, this._defaultBumpMap, this._defaultRoughessMap, this._normalMaterial),
                        sort: e.opaqueSortCompare
                      }), this._framebuffer.unbind(e)
                    }, bl.prototype.renderDebug = function (e) {
                      this._debugPass.render(e)
                    }, bl.prototype.dispose = function (e) {
                      this._depthTex.dispose(e), this._normalTex.dispose(e)
                    };
                    const wl = bl;

                    function Tl(e) {
                      e = e || {}, this._edgePass = new pn({
                        fragment: Xe.source("ecgl.edge")
                      }), this._edgePass.setUniform("normalTexture", e.normalTexture), this._edgePass.setUniform("depthTexture", e.depthTexture), this._targetTexture = new Dr({
                        type: wr.HALF_FLOAT
                      }), this._frameBuffer = new zi, this._frameBuffer.attach(this._targetTexture)
                    }
                    Tl.prototype.update = function (e, t, r, i) {
                      var n = e.getWidth(),
                        a = e.getHeight(),
                        o = this._targetTexture;
                      o.width = n, o.height = a;
                      var s = this._frameBuffer;
                      s.bind(e), this._edgePass.setUniform("projectionInv", t.invProjectionMatrix.array), this._edgePass.setUniform("textureSize", [n, a]), this._edgePass.setUniform("texture", r), this._edgePass.render(e), s.unbind(e)
                    }, Tl.prototype.getTargetTexture = function () {
                      return this._targetTexture
                    }, Tl.prototype.setParameter = function (e, t) {
                      this._edgePass.setUniform(e, t)
                    }, Tl.prototype.dispose = function (e) {
                      this._targetTexture.dispose(e), this._frameBuffer.dispose(e)
                    };
                    const Sl = Tl,
                      Ml = {
                        type: "compositor",
                        nodes: [{
                          name: "source",
                          type: "texture",
                          outputs: {
                            color: {}
                          }
                        }, {
                          name: "source_half",
                          shader: "#source(clay.compositor.downsample)",
                          inputs: {
                            texture: "source"
                          },
                          outputs: {
                            color: {
                              parameters: {
                                width: "expr(width * 1.0 / 2)",
                                height: "expr(height * 1.0 / 2)",
                                type: "HALF_FLOAT"
                              }
                            }
                          },
                          parameters: {
                            textureSize: "expr( [width * 1.0, height * 1.0] )"
                          }
                        }, {
                          name: "bright",
                          shader: "#source(clay.compositor.bright)",
                          inputs: {
                            texture: "source_half"
                          },
                          outputs: {
                            color: {
                              parameters: {
                                width: "expr(width * 1.0 / 2)",
                                height: "expr(height * 1.0 / 2)",
                                type: "HALF_FLOAT"
                              }
                            }
                          },
                          parameters: {
                            threshold: 2,
                            scale: 4,
                            textureSize: "expr([width * 1.0 / 2, height / 2])"
                          }
                        }, {
                          name: "bright_downsample_4",
                          shader: "#source(clay.compositor.downsample)",
                          inputs: {
                            texture: "bright"
                          },
                          outputs: {
                            color: {
                              parameters: {
                                width: "expr(width * 1.0 / 4)",
                                height: "expr(height * 1.0 / 4)",
                                type: "HALF_FLOAT"
                              }
                            }
                          },
                          parameters: {
                            textureSize: "expr( [width * 1.0 / 2, height / 2] )"
                          }
                        }, {
                          name: "bright_downsample_8",
                          shader: "#source(clay.compositor.downsample)",
                          inputs: {
                            texture: "bright_downsample_4"
                          },
                          outputs: {
                            color: {
                              parameters: {
                                width: "expr(width * 1.0 / 8)",
                                height: "expr(height * 1.0 / 8)",
                                type: "HALF_FLOAT"
                              }
                            }
                          },
                          parameters: {
                            textureSize: "expr( [width * 1.0 / 4, height / 4] )"
                          }
                        }, {
                          name: "bright_downsample_16",
                          shader: "#source(clay.compositor.downsample)",
                          inputs: {
                            texture: "bright_downsample_8"
                          },
                          outputs: {
                            color: {
                              parameters: {
                                width: "expr(width * 1.0 / 16)",
                                height: "expr(height * 1.0 / 16)",
                                type: "HALF_FLOAT"
                              }
                            }
                          },
                          parameters: {
                            textureSize: "expr( [width * 1.0 / 8, height / 8] )"
                          }
                        }, {
                          name: "bright_downsample_32",
                          shader: "#source(clay.compositor.downsample)",
                          inputs: {
                            texture: "bright_downsample_16"
                          },
                          outputs: {
                            color: {
                              parameters: {
                                width: "expr(width * 1.0 / 32)",
                                height: "expr(height * 1.0 / 32)",
                                type: "HALF_FLOAT"
                              }
                            }
                          },
                          parameters: {
                            textureSize: "expr( [width * 1.0 / 16, height / 16] )"
                          }
                        }, {
                          name: "bright_upsample_16_blur_h",
                          shader: "#source(clay.compositor.gaussian_blur)",
                          inputs: {
                            texture: "bright_downsample_32"
                          },
                          outputs: {
                            color: {
                              parameters: {
                                width: "expr(width * 1.0 / 16)",
                                height: "expr(height * 1.0 / 16)",
                                type: "HALF_FLOAT"
                              }
                            }
                          },
                          parameters: {
                            blurSize: 1,
                            blurDir: 0,
                            textureSize: "expr( [width * 1.0 / 32, height / 32] )"
                          }
                        }, {
                          name: "bright_upsample_16_blur_v",
                          shader: "#source(clay.compositor.gaussian_blur)",
                          inputs: {
                            texture: "bright_upsample_16_blur_h"
                          },
                          outputs: {
                            color: {
                              parameters: {
                                width: "expr(width * 1.0 / 16)",
                                height: "expr(height * 1.0 / 16)",
                                type: "HALF_FLOAT"
                              }
                            }
                          },
                          parameters: {
                            blurSize: 1,
                            blurDir: 1,
                            textureSize: "expr( [width * 1.0 / 16, height * 1.0 / 16] )"
                          }
                        }, {
                          name: "bright_upsample_8_blur_h",
                          shader: "#source(clay.compositor.gaussian_blur)",
                          inputs: {
                            texture: "bright_downsample_16"
                          },
                          outputs: {
                            color: {
                              parameters: {
                                width: "expr(width * 1.0 / 8)",
                                height: "expr(height * 1.0 / 8)",
                                type: "HALF_FLOAT"
                              }
                            }
                          },
                          parameters: {
                            blurSize: 1,
                            blurDir: 0,
                            textureSize: "expr( [width * 1.0 / 16, height * 1.0 / 16] )"
                          }
                        }, {
                          name: "bright_upsample_8_blur_v",
                          shader: "#source(clay.compositor.gaussian_blur)",
                          inputs: {
                            texture: "bright_upsample_8_blur_h"
                          },
                          outputs: {
                            color: {
                              parameters: {
                                width: "expr(width * 1.0 / 8)",
                                height: "expr(height * 1.0 / 8)",
                                type: "HALF_FLOAT"
                              }
                            }
                          },
                          parameters: {
                            blurSize: 1,
                            blurDir: 1,
                            textureSize: "expr( [width * 1.0 / 8, height * 1.0 / 8] )"
                          }
                        }, {
                          name: "bright_upsample_8_blend",
                          shader: "#source(clay.compositor.blend)",
                          inputs: {
                            texture1: "bright_upsample_8_blur_v",
                            texture2: "bright_upsample_16_blur_v"
                          },
                          outputs: {
                            color: {
                              parameters: {
                                width: "expr(width * 1.0 / 8)",
                                height: "expr(height * 1.0 / 8)",
                                type: "HALF_FLOAT"
                              }
                            }
                          },
                          parameters: {
                            weight1: .3,
                            weight2: .7
                          }
                        }, {
                          name: "bright_upsample_4_blur_h",
                          shader: "#source(clay.compositor.gaussian_blur)",
                          inputs: {
                            texture: "bright_downsample_8"
                          },
                          outputs: {
                            color: {
                              parameters: {
                                width: "expr(width * 1.0 / 4)",
                                height: "expr(height * 1.0 / 4)",
                                type: "HALF_FLOAT"
                              }
                            }
                          },
                          parameters: {
                            blurSize: 1,
                            blurDir: 0,
                            textureSize: "expr( [width * 1.0 / 8, height * 1.0 / 8] )"
                          }
                        }, {
                          name: "bright_upsample_4_blur_v",
                          shader: "#source(clay.compositor.gaussian_blur)",
                          inputs: {
                            texture: "bright_upsample_4_blur_h"
                          },
                          outputs: {
                            color: {
                              parameters: {
                                width: "expr(width * 1.0 / 4)",
                                height: "expr(height * 1.0 / 4)",
                                type: "HALF_FLOAT"
                              }
                            }
                          },
                          parameters: {
                            blurSize: 1,
                            blurDir: 1,
                            textureSize: "expr( [width * 1.0 / 4, height * 1.0 / 4] )"
                          }
                        }, {
                          name: "bright_upsample_4_blend",
                          shader: "#source(clay.compositor.blend)",
                          inputs: {
                            texture1: "bright_upsample_4_blur_v",
                            texture2: "bright_upsample_8_blend"
                          },
                          outputs: {
                            color: {
                              parameters: {
                                width: "expr(width * 1.0 / 4)",
                                height: "expr(height * 1.0 / 4)",
                                type: "HALF_FLOAT"
                              }
                            }
                          },
                          parameters: {
                            weight1: .3,
                            weight2: .7
                          }
                        }, {
                          name: "bright_upsample_2_blur_h",
                          shader: "#source(clay.compositor.gaussian_blur)",
                          inputs: {
                            texture: "bright_downsample_4"
                          },
                          outputs: {
                            color: {
                              parameters: {
                                width: "expr(width * 1.0 / 2)",
                                height: "expr(height * 1.0 / 2)",
                                type: "HALF_FLOAT"
                              }
                            }
                          },
                          parameters: {
                            blurSize: 1,
                            blurDir: 0,
                            textureSize: "expr( [width * 1.0 / 4, height * 1.0 / 4] )"
                          }
                        }, {
                          name: "bright_upsample_2_blur_v",
                          shader: "#source(clay.compositor.gaussian_blur)",
                          inputs: {
                            texture: "bright_upsample_2_blur_h"
                          },
                          outputs: {
                            color: {
                              parameters: {
                                width: "expr(width * 1.0 / 2)",
                                height: "expr(height * 1.0 / 2)",
                                type: "HALF_FLOAT"
                              }
                            }
                          },
                          parameters: {
                            blurSize: 1,
                            blurDir: 1,
                            textureSize: "expr( [width * 1.0 / 2, height * 1.0 / 2] )"
                          }
                        }, {
                          name: "bright_upsample_2_blend",
                          shader: "#source(clay.compositor.blend)",
                          inputs: {
                            texture1: "bright_upsample_2_blur_v",
                            texture2: "bright_upsample_4_blend"
                          },
                          outputs: {
                            color: {
                              parameters: {
                                width: "expr(width * 1.0 / 2)",
                                height: "expr(height * 1.0 / 2)",
                                type: "HALF_FLOAT"
                              }
                            }
                          },
                          parameters: {
                            weight1: .3,
                            weight2: .7
                          }
                        }, {
                          name: "bright_upsample_full_blur_h",
                          shader: "#source(clay.compositor.gaussian_blur)",
                          inputs: {
                            texture: "bright"
                          },
                          outputs: {
                            color: {
                              parameters: {
                                width: "expr(width * 1.0)",
                                height: "expr(height * 1.0)",
                                type: "HALF_FLOAT"
                              }
                            }
                          },
                          parameters: {
                            blurSize: 1,
                            blurDir: 0,
                            textureSize: "expr( [width * 1.0 / 2, height * 1.0 / 2] )"
                          }
                        }, {
                          name: "bright_upsample_full_blur_v",
                          shader: "#source(clay.compositor.gaussian_blur)",
                          inputs: {
                            texture: "bright_upsample_full_blur_h"
                          },
                          outputs: {
                            color: {
                              parameters: {
                                width: "expr(width * 1.0)",
                                height: "expr(height * 1.0)",
                                type: "HALF_FLOAT"
                              }
                            }
                          },
                          parameters: {
                            blurSize: 1,
                            blurDir: 1,
                            textureSize: "expr( [width * 1.0, height * 1.0] )"
                          }
                        }, {
                          name: "bloom_composite",
                          shader: "#source(clay.compositor.blend)",
                          inputs: {
                            texture1: "bright_upsample_full_blur_v",
                            texture2: "bright_upsample_2_blend"
                          },
                          outputs: {
                            color: {
                              parameters: {
                                width: "expr(width * 1.0)",
                                height: "expr(height * 1.0)",
                                type: "HALF_FLOAT"
                              }
                            }
                          },
                          parameters: {
                            weight1: .3,
                            weight2: .7
                          }
                        }, {
                          name: "coc",
                          shader: "#source(ecgl.dof.coc)",
                          outputs: {
                            color: {
                              parameters: {
                                minFilter: "NEAREST",
                                magFilter: "NEAREST",
                                width: "expr(width * 1.0)",
                                height: "expr(height * 1.0)"
                              }
                            }
                          },
                          parameters: {
                            focalDist: 50,
                            focalRange: 30
                          }
                        }, {
                          name: "dof_far_blur",
                          shader: "#source(ecgl.dof.diskBlur)",
                          inputs: {
                            texture: "source",
                            coc: "coc"
                          },
                          outputs: {
                            color: {
                              parameters: {
                                width: "expr(width * 1.0)",
                                height: "expr(height * 1.0)",
                                type: "HALF_FLOAT"
                              }
                            }
                          },
                          parameters: {
                            textureSize: "expr( [width * 1.0, height * 1.0] )"
                          }
                        }, {
                          name: "dof_near_blur",
                          shader: "#source(ecgl.dof.diskBlur)",
                          inputs: {
                            texture: "source",
                            coc: "coc"
                          },
                          outputs: {
                            color: {
                              parameters: {
                                width: "expr(width * 1.0)",
                                height: "expr(height * 1.0)",
                                type: "HALF_FLOAT"
                              }
                            }
                          },
                          parameters: {
                            textureSize: "expr( [width * 1.0, height * 1.0] )"
                          },
                          defines: {
                            BLUR_NEARFIELD: null
                          }
                        }, {
                          name: "dof_coc_blur",
                          shader: "#source(ecgl.dof.diskBlur)",
                          inputs: {
                            texture: "coc"
                          },
                          outputs: {
                            color: {
                              parameters: {
                                minFilter: "NEAREST",
                                magFilter: "NEAREST",
                                width: "expr(width * 1.0)",
                                height: "expr(height * 1.0)"
                              }
                            }
                          },
                          parameters: {
                            textureSize: "expr( [width * 1.0, height * 1.0] )"
                          },
                          defines: {
                            BLUR_COC: null
                          }
                        }, {
                          name: "dof_composite",
                          shader: "#source(ecgl.dof.composite)",
                          inputs: {
                            original: "source",
                            blurred: "dof_far_blur",
                            nearfield: "dof_near_blur",
                            coc: "coc",
                            nearcoc: "dof_coc_blur"
                          },
                          outputs: {
                            color: {
                              parameters: {
                                width: "expr(width * 1.0)",
                                height: "expr(height * 1.0)",
                                type: "HALF_FLOAT"
                              }
                            }
                          }
                        }, {
                          name: "composite",
                          shader: "#source(clay.compositor.hdr.composite)",
                          inputs: {
                            texture: "source",
                            bloom: "bloom_composite"
                          },
                          outputs: {
                            color: {
                              parameters: {
                                width: "expr(width * 1.0)",
                                height: "expr(height * 1.0)"
                              }
                            }
                          },
                          defines: {}
                        }, {
                          name: "FXAA",
                          shader: "#source(clay.compositor.fxaa)",
                          inputs: {
                            texture: "composite"
                          }
                        }]
                      };

                    function Al(e, t) {
                      return {
                        color: {
                          parameters: {
                            width: e,
                            height: t
                          }
                        }
                      }
                    }
                    Xe.import(Zs), Xe.import(Ys), Xe.import(Ks), Xe.import(Qs), Xe.import(Js), Xe.import($s), Xe.import(el), Xe.import(tl), Xe.import(rl), Xe.import("@export ecgl.dof.coc\n\nuniform sampler2D depth;\n\nuniform float zNear: 0.1;\nuniform float zFar: 2000;\n\nuniform float focalDistance: 3;\nuniform float focalRange: 1;\nuniform float focalLength: 30;\nuniform float fstop: 2.8;\n\nvarying vec2 v_Texcoord;\n\n@import clay.util.encode_float\n\nvoid main()\n{\n float z = texture2D(depth, v_Texcoord).r * 2.0 - 1.0;\n\n float dist = 2.0 * zNear * zFar / (zFar + zNear - z * (zFar - zNear));\n\n float aperture = focalLength / fstop;\n\n float coc;\n\n float uppper = focalDistance + focalRange;\n float lower = focalDistance - focalRange;\n if (dist <= uppper && dist >= lower) {\n coc = 0.5;\n }\n else {\n float focalAdjusted = dist > uppper ? uppper : lower;\n\n coc = abs(aperture * (focalLength * (dist - focalAdjusted)) / (dist * (focalAdjusted - focalLength)));\n coc = clamp(coc, 0.0, 2.0) / 2.00001;\n\n if (dist < lower) {\n coc = -coc;\n }\n coc = coc * 0.5 + 0.5;\n }\n\n gl_FragColor = encodeFloat(coc);\n}\n@end\n\n\n@export ecgl.dof.composite\n\n#define DEBUG 0\n\nuniform sampler2D original;\nuniform sampler2D blurred;\nuniform sampler2D nearfield;\nuniform sampler2D coc;\nuniform sampler2D nearcoc;\nvarying vec2 v_Texcoord;\n\n@import clay.util.rgbm\n@import clay.util.float\n\nvoid main()\n{\n vec4 blurredColor = texture2D(blurred, v_Texcoord);\n vec4 originalColor = texture2D(original, v_Texcoord);\n\n float fCoc = decodeFloat(texture2D(coc, v_Texcoord));\n\n fCoc = abs(fCoc * 2.0 - 1.0);\n\n float weight = smoothstep(0.0, 1.0, fCoc);\n \n#ifdef NEARFIELD_ENABLED\n vec4 nearfieldColor = texture2D(nearfield, v_Texcoord);\n float fNearCoc = decodeFloat(texture2D(nearcoc, v_Texcoord));\n fNearCoc = abs(fNearCoc * 2.0 - 1.0);\n\n gl_FragColor = encodeHDR(\n mix(\n nearfieldColor, mix(originalColor, blurredColor, weight),\n pow(1.0 - fNearCoc, 4.0)\n )\n );\n#else\n gl_FragColor = encodeHDR(mix(originalColor, blurredColor, weight));\n#endif\n\n}\n\n@end\n\n\n\n@export ecgl.dof.diskBlur\n\n#define POISSON_KERNEL_SIZE 16;\n\nuniform sampler2D texture;\nuniform sampler2D coc;\nvarying vec2 v_Texcoord;\n\nuniform float blurRadius : 10.0;\nuniform vec2 textureSize : [512.0, 512.0];\n\nuniform vec2 poissonKernel[POISSON_KERNEL_SIZE];\n\nuniform float percent;\n\nfloat nrand(const in vec2 n) {\n return fract(sin(dot(n.xy ,vec2(12.9898,78.233))) * 43758.5453);\n}\n\n@import clay.util.rgbm\n@import clay.util.float\n\n\nvoid main()\n{\n vec2 offset = blurRadius / textureSize;\n\n float rnd = 6.28318 * nrand(v_Texcoord + 0.07 * percent );\n float cosa = cos(rnd);\n float sina = sin(rnd);\n vec4 basis = vec4(cosa, -sina, sina, cosa);\n\n#if !defined(BLUR_NEARFIELD) && !defined(BLUR_COC)\n offset *= abs(decodeFloat(texture2D(coc, v_Texcoord)) * 2.0 - 1.0);\n#endif\n\n#ifdef BLUR_COC\n float cocSum = 0.0;\n#else\n vec4 color = vec4(0.0);\n#endif\n\n\n float weightSum = 0.0;\n\n for (int i = 0; i < POISSON_KERNEL_SIZE; i++) {\n vec2 ofs = poissonKernel[i];\n\n ofs = vec2(dot(ofs, basis.xy), dot(ofs, basis.zw));\n\n vec2 uv = v_Texcoord + ofs * offset;\n vec4 texel = texture2D(texture, uv);\n\n float w = 1.0;\n#ifdef BLUR_COC\n float fCoc = decodeFloat(texel) * 2.0 - 1.0;\n cocSum += clamp(fCoc, -1.0, 0.0) * w;\n#else\n texel = texel;\n #if !defined(BLUR_NEARFIELD)\n float fCoc = decodeFloat(texture2D(coc, uv)) * 2.0 - 1.0;\n w *= abs(fCoc);\n #endif\n texel.rgb *= texel.a;\n color += texel * w;\n#endif\n\n weightSum += w;\n }\n\n#ifdef BLUR_COC\n gl_FragColor = encodeFloat(clamp(cocSum / weightSum, -1.0, 0.0) * 0.5 + 0.5);\n#else\n color /= weightSum;\n color.rgb /= (color.a + 0.0001);\n gl_FragColor = color;\n#endif\n}\n\n@end"), Xe.import("@export ecgl.edge\n\nuniform sampler2D texture;\n\nuniform sampler2D normalTexture;\nuniform sampler2D depthTexture;\n\nuniform mat4 projectionInv;\n\nuniform vec2 textureSize;\n\nuniform vec4 edgeColor: [0,0,0,0.8];\n\nvarying vec2 v_Texcoord;\n\nvec3 packColor(vec2 coord) {\n float z = texture2D(depthTexture, coord).r * 2.0 - 1.0;\n vec4 p = vec4(v_Texcoord * 2.0 - 1.0, z, 1.0);\n vec4 p4 = projectionInv * p;\n\n return vec3(\n texture2D(normalTexture, coord).rg,\n -p4.z / p4.w / 5.0\n );\n}\n\nvoid main() {\n vec2 cc = v_Texcoord;\n vec3 center = packColor(cc);\n\n float size = clamp(1.0 - (center.z - 10.0) / 100.0, 0.0, 1.0) * 0.5;\n float dx = size / textureSize.x;\n float dy = size / textureSize.y;\n\n vec2 coord;\n vec3 topLeft = packColor(cc+vec2(-dx, -dy));\n vec3 top = packColor(cc+vec2(0.0, -dy));\n vec3 topRight = packColor(cc+vec2(dx, -dy));\n vec3 left = packColor(cc+vec2(-dx, 0.0));\n vec3 right = packColor(cc+vec2(dx, 0.0));\n vec3 bottomLeft = packColor(cc+vec2(-dx, dy));\n vec3 bottom = packColor(cc+vec2(0.0, dy));\n vec3 bottomRight = packColor(cc+vec2(dx, dy));\n\n vec3 v = -topLeft-2.0*top-topRight+bottomLeft+2.0*bottom+bottomRight;\n vec3 h = -bottomLeft-2.0*left-topLeft+bottomRight+2.0*right+topRight;\n\n float edge = sqrt(dot(h, h) + dot(v, v));\n\n edge = smoothstep(0.8, 1.0, edge);\n\n gl_FragColor = mix(texture2D(texture, v_Texcoord), vec4(edgeColor.rgb, 1.0), edgeColor.a * edge);\n}\n@end");
                    var El = ["composite", "FXAA"];

                    function Cl() {
                      this._width, this._height, this._dpr, this._sourceTexture = new Dr({
                        type: wr.HALF_FLOAT
                      }), this._depthTexture = new Dr({
                        format: wr.DEPTH_COMPONENT,
                        type: wr.UNSIGNED_INT
                      }), this._framebuffer = new zi, this._framebuffer.attach(this._sourceTexture), this._framebuffer.attach(this._depthTexture, zi.DEPTH_ATTACHMENT), this._normalPass = new wl, this._compositor = function (e, t) {
                        var r = new Ws;
                        t = t || {};
                        var i = {
                          textures: {},
                          parameters: {}
                        };
                        for (var n in e.parameters) {
                          var a = e.parameters[n];
                          i.parameters[n] = sl(a)
                        }
                        return function (e, t, r, i) {
                          if (e.textures) {
                            var n = {},
                              a = 0,
                              o = !1,
                              s = r.textureRootPath;
                            f.each(e.textures, (function (e, t) {
                              var r, l = e.path,
                                h = sl(e.parameters);
                              if (Array.isArray(l) && 6 === l.length) s && (l = l.map((function (e) {
                                return f.relative2absolute(e, s)
                              }))), r = new Ai(h);
                              else {
                                if ("string" != typeof l) return;
                                s && (l = f.relative2absolute(l, s)), r = new Dr(h)
                              }
                              r.load(l), a++, r.once("success", (function () {
                                n[t] = r, 0 == --a && (i(n), o = !0)
                              }))
                            })), 0 !== a || o || i(n)
                          } else i({})
                        }(e, 0, t, (function (n) {
                          i.textures = n,
                            function (n, a) {
                              for (var o = 0; o < e.nodes.length; o++) {
                                var s = nl(e.nodes[o], i, t);
                                s && r.addNode(s)
                              }
                            }()
                        })), r
                      }(Ml);
                      var e = this._compositor.getNodeByName("source");
                      e.texture = this._sourceTexture;
                      var t = this._compositor.getNodeByName("coc");
                      this._sourceNode = e, this._cocNode = t, this._compositeNode = this._compositor.getNodeByName("composite"), this._fxaaNode = this._compositor.getNodeByName("FXAA"), this._dofBlurNodes = ["dof_far_blur", "dof_near_blur", "dof_coc_blur"].map((function (e) {
                        return this._compositor.getNodeByName(e)
                      }), this), this._dofBlurKernel = 0, this._dofBlurKernelSize = new Float32Array(0), this._finalNodesChain = El.map((function (e) {
                        return this._compositor.getNodeByName(e)
                      }), this);
                      var r = {
                        normalTexture: this._normalPass.getNormalTexture(),
                        depthTexture: this._normalPass.getDepthTexture()
                      };
                      this._ssaoPass = new ml(r), this._ssrPass = new _l(r), this._edgePass = new Sl(r)
                    }
                    Cl.prototype.resize = function (e, t, r) {
                      e *= r = r || 1, t *= r;
                      var i = this._sourceTexture,
                        n = this._depthTexture;
                      i.width = e, i.height = t, n.width = e, n.height = t;
                      var a = {
                        getWidth: function () {
                          return e
                        },
                        getHeight: function () {
                          return t
                        },
                        getDevicePixelRatio: function () {
                          return r
                        }
                      };

                      function o(e, t) {
                        if ("function" == typeof e[t]) {
                          var r = e[t].__original || e[t];
                          e[t] = function (e) {
                            return r.call(this, a)
                          }, e[t].__original = r
                        }
                      }
                      this._compositor.nodes.forEach((function (e) {
                        for (var t in e.outputs) {
                          var r = e.outputs[t].parameters;
                          r && (o(r, "width"), o(r, "height"))
                        }
                        for (var i in e.parameters) o(e.parameters, i)
                      })), this._width = e, this._height = t, this._dpr = r
                    }, Cl.prototype.getWidth = function () {
                      return this._width
                    }, Cl.prototype.getHeight = function () {
                      return this._height
                    }, Cl.prototype._ifRenderNormalPass = function () {
                      return this._enableSSAO || this._enableEdge || this._enableSSR
                    }, Cl.prototype._getPrevNode = function (e) {
                      for (var t = El.indexOf(e.name) - 1, r = this._finalNodesChain[t]; r && !this._compositor.getNodeByName(r.name);) t -= 1, r = this._finalNodesChain[t];
                      return r
                    }, Cl.prototype._getNextNode = function (e) {
                      for (var t = El.indexOf(e.name) + 1, r = this._finalNodesChain[t]; r && !this._compositor.getNodeByName(r.name);) t += 1, r = this._finalNodesChain[t];
                      return r
                    }, Cl.prototype._addChainNode = function (e) {
                      var t = this._getPrevNode(e),
                        r = this._getNextNode(e);
                      t && (e.inputs.texture = t.name, r ? (e.outputs = Al(this.getWidth.bind(this), this.getHeight.bind(this)), r.inputs.texture = e.name) : e.outputs = null, this._compositor.addNode(e))
                    }, Cl.prototype._removeChainNode = function (e) {
                      var t = this._getPrevNode(e),
                        r = this._getNextNode(e);
                      t && (r ? (t.outputs = Al(this.getWidth.bind(this), this.getHeight.bind(this)), r.inputs.texture = t.name) : t.outputs = null, this._compositor.removeNode(e))
                    }, Cl.prototype.updateNormal = function (e, t, r, i) {
                      this._ifRenderNormalPass() && this._normalPass.update(e, t, r)
                    }, Cl.prototype.updateSSAO = function (e, t, r, i) {
                      this._ssaoPass.update(e, r, i)
                    }, Cl.prototype.enableSSAO = function () {
                      this._enableSSAO = !0
                    }, Cl.prototype.disableSSAO = function () {
                      this._enableSSAO = !1
                    }, Cl.prototype.enableSSR = function () {
                      this._enableSSR = !0
                    }, Cl.prototype.disableSSR = function () {
                      this._enableSSR = !1
                    }, Cl.prototype.getSSAOTexture = function () {
                      return this._ssaoPass.getTargetTexture()
                    }, Cl.prototype.getSourceFrameBuffer = function () {
                      return this._framebuffer
                    }, Cl.prototype.getSourceTexture = function () {
                      return this._sourceTexture
                    }, Cl.prototype.disableFXAA = function () {
                      this._removeChainNode(this._fxaaNode)
                    }, Cl.prototype.enableFXAA = function () {
                      this._addChainNode(this._fxaaNode)
                    }, Cl.prototype.enableBloom = function () {
                      this._compositeNode.inputs.bloom = "bloom_composite", this._compositor.dirty()
                    }, Cl.prototype.disableBloom = function () {
                      this._compositeNode.inputs.bloom = null, this._compositor.dirty()
                    }, Cl.prototype.enableDOF = function () {
                      this._compositeNode.inputs.texture = "dof_composite", this._compositor.dirty()
                    }, Cl.prototype.disableDOF = function () {
                      this._compositeNode.inputs.texture = "source", this._compositor.dirty()
                    }, Cl.prototype.enableColorCorrection = function () {
                      this._compositeNode.define("COLOR_CORRECTION"), this._enableColorCorrection = !0
                    }, Cl.prototype.disableColorCorrection = function () {
                      this._compositeNode.undefine("COLOR_CORRECTION"), this._enableColorCorrection = !1
                    }, Cl.prototype.enableEdge = function () {
                      this._enableEdge = !0
                    }, Cl.prototype.disableEdge = function () {
                      this._enableEdge = !1
                    }, Cl.prototype.setBloomIntensity = function (e) {
                      this._compositeNode.setParameter("bloomIntensity", e)
                    }, Cl.prototype.setSSAOParameter = function (e, t) {
                      switch (e) {
                        case "quality":
                          var r = {
                            low: 6,
                            medium: 12,
                            high: 32,
                            ultra: 62
                          } [t] || 12;
                          this._ssaoPass.setParameter("kernelSize", r);
                          break;
                        case "radius":
                          this._ssaoPass.setParameter(e, t), this._ssaoPass.setParameter("bias", t / 200);
                          break;
                        case "intensity":
                          this._ssaoPass.setParameter(e, t)
                      }
                    }, Cl.prototype.setDOFParameter = function (e, t) {
                      switch (e) {
                        case "focalDistance":
                        case "focalRange":
                        case "fstop":
                          this._cocNode.setParameter(e, t);
                          break;
                        case "blurRadius":
                          for (var r = 0; r < this._dofBlurNodes.length; r++) this._dofBlurNodes[r].setParameter("blurRadius", t);
                          break;
                        case "quality":
                          var i = {
                            low: 4,
                            medium: 8,
                            high: 16,
                            ultra: 32
                          } [t] || 8;
                          for (this._dofBlurKernelSize = i, r = 0; r < this._dofBlurNodes.length; r++) this._dofBlurNodes[r].pass.material.define("POISSON_KERNEL_SIZE", i);
                          this._dofBlurKernel = new Float32Array(2 * i)
                      }
                    }, Cl.prototype.setSSRParameter = function (e, t) {
                      if (null != t) switch (e) {
                        case "quality":
                          var r = {
                              low: 10,
                              medium: 15,
                              high: 30,
                              ultra: 80
                            } [t] || 20,
                            i = {
                              low: 32,
                              medium: 16,
                              high: 8,
                              ultra: 4
                            } [t] || 16;
                          this._ssrPass.setParameter("maxIteration", r), this._ssrPass.setParameter("pixelStride", i);
                          break;
                        case "maxRoughness":
                          this._ssrPass.setParameter("minGlossiness", Math.max(Math.min(1 - t, 1), 0));
                          break;
                        case "physical":
                          this.setPhysicallyCorrectSSR(t);
                          break;
                        default:
                          console.warn("Unkown SSR parameter " + e)
                      }
                    }, Cl.prototype.setPhysicallyCorrectSSR = function (e) {
                      this._ssrPass.setPhysicallyCorrect(e)
                    }, Cl.prototype.setEdgeColor = function (e) {
                      var t = Ka.parseColor(e);
                      this._edgePass.setParameter("edgeColor", t)
                    }, Cl.prototype.setExposure = function (e) {
                      this._compositeNode.setParameter("exposure", Math.pow(2, e))
                    }, Cl.prototype.setColorLookupTexture = function (e, t) {
                      this._compositeNode.pass.material.setTextureImage("lut", this._enableColorCorrection ? e : "none", t, {
                        minFilter: Ka.Texture.NEAREST,
                        magFilter: Ka.Texture.NEAREST,
                        flipY: !1
                      })
                    }, Cl.prototype.setColorCorrection = function (e, t) {
                      this._compositeNode.setParameter(e, t)
                    }, Cl.prototype.isSSREnabled = function () {
                      return this._enableSSR
                    }, Cl.prototype.composite = function (e, t, r, i, n) {
                      var a = this._sourceTexture,
                        o = a;
                      this._enableEdge && (this._edgePass.update(e, r, a, n), a = o = this._edgePass.getTargetTexture()), this._enableSSR && (this._ssrPass.update(e, r, a, n), o = this._ssrPass.getTargetTexture(), this._ssrPass.setSSAOTexture(this._enableSSAO ? this._ssaoPass.getTargetTexture() : null)), this._sourceNode.texture = o, this._cocNode.setParameter("depth", this._depthTexture);
                      for (var s = this._dofBlurKernel, l = this._dofBlurKernelSize, h = n % Math.floor(vl.length / 2 / l), u = 0; u < 2 * l; u++) s[u] = vl[u + h * l * 2];
                      for (u = 0; u < this._dofBlurNodes.length; u++) this._dofBlurNodes[u].setParameter("percent", n / 30), this._dofBlurNodes[u].setParameter("poissonKernel", s);
                      this._cocNode.setParameter("zNear", r.near), this._cocNode.setParameter("zFar", r.far), this._compositor.render(e, i)
                    }, Cl.prototype.dispose = function (e) {
                      this._sourceTexture.dispose(e), this._depthTexture.dispose(e), this._framebuffer.dispose(e), this._compositor.dispose(e), this._normalPass.dispose(e), this._ssaoPass.dispose(e)
                    };
                    const Dl = Cl;

                    function Ll(e) {
                      for (var t = [], r = 0; r < 30; r++) t.push([ul(r, 2), ul(r, 3)]);
                      this._haltonSequence = t, this._frame = 0, this._sourceTex = new Dr, this._sourceFb = new zi, this._sourceFb.attach(this._sourceTex), this._prevFrameTex = new Dr, this._outputTex = new Dr;
                      var i = this._blendPass = new pn({
                        fragment: Xe.source("clay.compositor.blend")
                      });
                      i.material.disableTexturesAll(), i.material.enableTexture(["texture1", "texture2"]), this._blendFb = new zi({
                        depthBuffer: !1
                      }), this._outputPass = new pn({
                        fragment: Xe.source("clay.compositor.output"),
                        blendWithPrevious: !0
                      }), this._outputPass.material.define("fragment", "OUTPUT_ALPHA"), this._outputPass.material.blend = function (e) {
                        e.blendEquationSeparate(e.FUNC_ADD, e.FUNC_ADD), e.blendFuncSeparate(e.ONE, e.ONE_MINUS_SRC_ALPHA, e.ONE, e.ONE_MINUS_SRC_ALPHA)
                      }
                    }
                    Ll.prototype = {
                      constructor: Ll,
                      jitterProjection: function (e, t) {
                        var r = e.viewport,
                          i = r.devicePixelRatio || e.getDevicePixelRatio(),
                          n = r.width * i,
                          a = r.height * i,
                          o = this._haltonSequence[this._frame % this._haltonSequence.length],
                          s = new Ht;
                        s.array[12] = (2 * o[0] - 1) / n, s.array[13] = (2 * o[1] - 1) / a, Ht.mul(t.projectionMatrix, s, t.projectionMatrix), Ht.invert(t.invProjectionMatrix, t.projectionMatrix)
                      },
                      resetFrame: function () {
                        this._frame = 0
                      },
                      getFrame: function () {
                        return this._frame
                      },
                      getSourceFrameBuffer: function () {
                        return this._sourceFb
                      },
                      getOutputTexture: function () {
                        return this._outputTex
                      },
                      resize: function (e, t) {
                        this._prevFrameTex.width = e, this._prevFrameTex.height = t, this._outputTex.width = e, this._outputTex.height = t, this._sourceTex.width = e, this._sourceTex.height = t, this._prevFrameTex.dirty(), this._outputTex.dirty(), this._sourceTex.dirty()
                      },
                      isFinished: function () {
                        return this._frame >= this._haltonSequence.length
                      },
                      render: function (e, t, r) {
                        var i = this._blendPass;
                        0 === this._frame ? (i.setUniform("weight1", 0), i.setUniform("weight2", 1)) : (i.setUniform("weight1", .9), i.setUniform("weight2", .1)), i.setUniform("texture1", this._prevFrameTex), i.setUniform("texture2", t || this._sourceTex), this._blendFb.attach(this._outputTex), this._blendFb.bind(e), i.render(e), this._blendFb.unbind(e), r || (this._outputPass.setUniform("texture", this._outputTex), this._outputPass.render(e));
                        var n = this._prevFrameTex;
                        this._prevFrameTex = this._outputTex, this._outputTex = n, this._frame++
                      },
                      dispose: function (e) {
                        this._sourceFb.dispose(e), this._blendFb.dispose(e), this._prevFrameTex.dispose(e), this._outputTex.dispose(e), this._sourceTex.dispose(e), this._outputPass.dispose(e), this._blendPass.dispose(e)
                      }
                    };
                    const Pl = Ll;

                    function Ol(e) {
                      e = e || "perspective", this.layer = null, this.scene = new vi, this.rootNode = this.scene, this.viewport = {
                        x: 0,
                        y: 0,
                        width: 0,
                        height: 0
                      }, this.setProjection(e), this._compositor = new Dl, this._temporalSS = new Pl, this._shadowMapPass = new ks;
                      for (var t = [], r = 0, i = 0; i < 30; i++) {
                        for (var n = [], a = 0; a < 6; a++) n.push(4 * ul(r, 2) - 2), n.push(4 * ul(r, 3) - 2), r++;
                        t.push(n)
                      }
                      this._pcfKernels = t, this.scene.on("beforerender", (function (e, t, r) {
                        this.needsTemporalSS() && this._temporalSS.jitterProjection(e, r)
                      }), this)
                    }
                    Ol.prototype.setProjection = function (e) {
                      var t = this.camera;
                      t && t.update(), "perspective" === e ? this.camera instanceof Ei || (this.camera = new Ei, t && this.camera.setLocalTransform(t.localTransform)) : this.camera instanceof un || (this.camera = new un, t && this.camera.setLocalTransform(t.localTransform)), this.camera.near = .1, this.camera.far = 2e3
                    }, Ol.prototype.setViewport = function (e, t, r, i, n) {
                      this.camera instanceof Ei && (this.camera.aspect = r / i), n = n || 1, this.viewport.x = e, this.viewport.y = t, this.viewport.width = r, this.viewport.height = i, this.viewport.devicePixelRatio = n, this._compositor.resize(r * n, i * n), this._temporalSS.resize(r * n, i * n)
                    }, Ol.prototype.containPoint = function (e, t) {
                      var r = this.viewport;
                      return t = this.layer.renderer.getHeight() - t, e >= r.x && t >= r.y && e <= r.x + r.width && t <= r.y + r.height
                    };
                    var Nl = new _e;
                    Ol.prototype.castRay = function (e, t, r) {
                        var i = this.layer.renderer,
                          n = i.viewport;
                        return i.viewport = this.viewport, i.screenToNDC(e, t, Nl), this.camera.castRay(Nl, r), i.viewport = n, r
                      }, Ol.prototype.prepareRender = function () {
                        this.scene.update(), this.camera.update(), this.scene.updateLights();
                        var e = this.scene.updateRenderList(this.camera);
                        this._needsSortProgressively = !1;
                        for (var t = 0; t < e.transparent.length; t++) {
                          var r = e.transparent[t].geometry;
                          r.needsSortVerticesProgressively && r.needsSortVerticesProgressively() && (this._needsSortProgressively = !0), r.needsSortTrianglesProgressively && r.needsSortTrianglesProgressively() && (this._needsSortProgressively = !0)
                        }
                        this._frame = 0, this._temporalSS.resetFrame()
                      }, Ol.prototype.render = function (e, t) {
                        this._doRender(e, t, this._frame), this._frame++
                      }, Ol.prototype.needsAccumulate = function () {
                        return this.needsTemporalSS() || this._needsSortProgressively
                      }, Ol.prototype.needsTemporalSS = function () {
                        var e = this._enableTemporalSS;
                        return "auto" === e && (e = this._enablePostEffect), e
                      }, Ol.prototype.hasDOF = function () {
                        return this._enableDOF
                      }, Ol.prototype.isAccumulateFinished = function () {
                        return this.needsTemporalSS() ? this._temporalSS.isFinished() : this._frame > 30
                      }, Ol.prototype._doRender = function (e, t, r) {
                        var i = this.scene,
                          n = this.camera;
                        r = r || 0, this._updateTransparent(e, i, n, r), t || (this._shadowMapPass.kernelPCF = this._pcfKernels[0], this._shadowMapPass.render(e, i, n, !0)), this._updateShadowPCFKernel(r);
                        var a, o = e.clearColor;
                        e.gl.clearColor(o[0], o[1], o[2], o[3]), this._enablePostEffect && (this.needsTemporalSS() && this._temporalSS.jitterProjection(e, n), this._compositor.updateNormal(e, i, n, this._temporalSS.getFrame())), this._updateSSAO(e, i, n, this._temporalSS.getFrame()), this._enablePostEffect ? ((a = this._compositor.getSourceFrameBuffer()).bind(e), e.gl.clear(e.gl.DEPTH_BUFFER_BIT | e.gl.COLOR_BUFFER_BIT), e.render(i, n, !0, !0), a.unbind(e), this.needsTemporalSS() && t ? (this._compositor.composite(e, i, n, this._temporalSS.getSourceFrameBuffer(), this._temporalSS.getFrame()), e.setViewport(this.viewport), this._temporalSS.render(e)) : (e.setViewport(this.viewport), this._compositor.composite(e, i, n, null, 0))) : this.needsTemporalSS() && t ? ((a = this._temporalSS.getSourceFrameBuffer()).bind(e), e.saveClear(), e.clearBit = e.gl.DEPTH_BUFFER_BIT | e.gl.COLOR_BUFFER_BIT, e.render(i, n, !0, !0), e.restoreClear(), a.unbind(e), e.setViewport(this.viewport), this._temporalSS.render(e)) : (e.setViewport(this.viewport), e.render(i, n, !0, !0))
                      }, Ol.prototype._updateTransparent = function (e, t, r, i) {
                        for (var n = new vt, a = new Ht, o
